我有两个等长的整数向量。假设我想删除第一个向量中的所有项目,即NAN。显然,我使用remove_if算法。假设这删除了索引1,2,5处的元素。然后我想从这些索引中的第二个向量中移除项目。根据一个向量中的值从两个向量中删除项目
什么是最典型的C++方法呢?
我有两个等长的整数向量。假设我想删除第一个向量中的所有项目,即NAN。显然,我使用remove_if算法。假设这删除了索引1,2,5处的元素。然后我想从这些索引中的第二个向量中移除项目。根据一个向量中的值从两个向量中删除项目
什么是最典型的C++方法呢?
使用一个vector<pair<int, int>>
到结合这两个矢量在一起。然后,根据第一个元素执行删除操作,并同时删除这两个元素。
这可以使用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));
});
这太棒了。谢谢!我选择使用boost :: combine生成一个范围,我可以在remove_if中调用begin()和end(),我认为没有真正的区别? – experquisite 2015-04-21 18:45:22
@experquisite这是一个很好的想法,相当多地清理了代码。我补充说,答案。谢谢! – Praetorian 2015-05-07 00:57:38
如果它们是相关的值,其中最典型的方法是把数据的两件在同一个对象,并包含有这些对象的一个载体... – cdhowie 2014-10-30 16:28:20
像@cdhowie说,如果你知道他们有相同的长度和价值链接,你应该首先有一个'std :: vector>' –
PeterT
2014-10-30 16:29:13