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

Tom*_*ies 3 c++ stl vector

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

这种规范的C++最常用的方法是什么?

Pra*_*ian 10

这可以通过使用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));
                             });
Run Code Online (Sandbox Code Playgroud)

然后使用vector::erase删除不需要的元素.

v1.erase(boost::get<0>(result.get_iterator_tuple()), v1.end());
v2.erase(boost::get<1>(result.get_iterator_tuple()), v2.end());
Run Code Online (Sandbox Code Playgroud)

现场演示


使用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));
                               });
Run Code Online (Sandbox Code Playgroud)

现场演示


Pau*_*ans 1

使用 avector<pair<int, int>>将两个向量连接在一起。然后,根据第一个元素执行删除操作,并同时删除这两个元素。