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

Remove items from two vectors depending on the values inside one vector

本文关键字:向量 两个 项目 一个      更新时间:2023-10-16

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

最规范的C++方法是什么?

这可以使用Boost来完成,方法是创建一个zip_iterator,然后并行迭代两个容器中迭代器的tuple

首先传递一对zip_iteratorsstd::remove_if,并让谓词检查NaN 的第一个vector的元素

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());

现场演示


创建压缩迭代器范围所需的样板可以通过使用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));
                               });

实时演示

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