根据一个向量内的值从两个向量中删除项目

时间:2014-10-30 16:20:47

标签: c++ vector stl

我有两个长度相等的整数向量。让我们说我想删除第一个向量中NAN的所有项目。显然,我使用remove_if算法。让我们说这会删除索引1,2,5处的元素。然后我想在这些索引处从第二个向量中删除项目。

最典型的C ++方式是什么?

2 个答案:

答案 0 :(得分:10)

这可以通过创建zip_iterator使用Boost来完成,然后并行迭代来自两个容器的tuple迭代器。

首先将一对zip_iterators传递给std::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

答案 1 :(得分:1)

一起使用vector<pair<int, int>> 绑定两个向量。然后,根据第一个元素执行删除并同时删除它们。