我有两个相等长度的整数向量。假设我想删除第一个向量中所有的NAN项。显然,我使用remove_if算法。假设这将删除索引为1、2、5的元素。然后,我想从第二个向量中删除这些索引处的项目。
在C++中,最经典的方法是什么?
在C++中,最经典的方法是什么?
可以使用Boost通过创建一个zip_iterator
并同时迭代来自两个容器的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());
通过使用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>>
将两个向量绑定在一起。然后,根据第一个元素执行删除操作,并同时将两个元素一起删除。
std::vector<std::pair<int,int>>
。 - PeterT