2014-10-30 85 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