2014-10-30 56 views
3

我有兩個等長的整數向量。假設我想刪除第一個向量中的所有項目,即NAN。顯然,我使用remove_if算法。假設這刪除了索引1,2,5處的元素。然後我想從這些索引中的第二個向量中移除項目。根據一個向量中的值從兩個向量中刪除項目

什麼是最典型的C++方法呢?

+1

如果它們是相關的值,其中最典型的方法是把數據的兩件在同一個對象,幷包含有這些對象的一個​​載體... – cdhowie 2014-10-30 16:28:20

+1

像@cdhowie說,如果你知道他們有相同的長度和價值鏈接,你應該首先有一個'std :: vector >' – PeterT 2014-10-30 16:29:13

回答

1

使用一個vector<pair<int, int>>結合這兩個矢量在一起。然後,根據第一個元素執行刪除操作,並同時刪除這兩個元素。

9

這可以使用Boost創建一個zip_iterator,然後從兩個容器中並行迭代迭代器的tuple

首先通過一對zip_iteratorsstd::remove_if,並具有謂詞檢查第一vector的元素的NaN

auto result = std::remove_if(boost::make_zip_iterator(boost::make_tuple(v1.begin(), v2.begin())), 
          boost::make_zip_iterator(boost::make_tuple(v1.end(), v2.end())), 
          [](boost::tuple<double, int> const& elem) { 
           return std::isnan(boost::get<0>(elem)); 
          }); 

然後使用vector::erase以除去不需要的元素。

v1.erase(boost::get<0>(result.get_iterator_tuple()), v1.end()); 
v2.erase(boost::get<1>(result.get_iterator_tuple()), v2.end()); 

Live demo


以創建壓縮的迭代範圍所需的樣板可以通過使用boost::combine和Boost.Range的版本的remove_if被進一步減小。

auto result = boost::remove_if(boost::combine(v1, v2), 
           [](boost::tuple<double, int> const& elem) { 
            return std::isnan(boost::get<0>(elem)); 
           }); 

Live demo

+0

這太棒了。謝謝!我選擇使用boost :: combine生成一個範圍,我可以在remove_if中調用begin()和end(),我認爲沒有真正的區別? – experquisite 2015-04-21 18:45:22

+1

@experquisite這是一個很好的想法,相當多地清理了代碼。我補充說,答案。謝謝! – Praetorian 2015-05-07 00:57:38