加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:10:38 所属栏目:百科 来源:网络整理
导读:我有两个相等长度的整数向量.假设我要删除第一个向量中NAN的所有项.显然,我使用remove_if算法.让我们说这会删除索引1,2,5处的元素.然后我想在这些索引处从第二个向量中删除项目. 最常规的C方式是什么? 解决方法 这可以通过创建一个 zip_iterator 使用Boost
我有两个相等长度的整数向量.假设我要删除第一个向量中NAN的所有项.显然,我使用remove_if算法.让我们说这会删除索引1,2,5处的元素.然后我想在这些索引处从第二个向量中删除项目.

最常规的C方式是什么?

解决方法

这可以通过创建一个 zip_iterator使用Boost完成,然后并行迭代两个容器的迭代器元组.

首先将一对zip_iterator传递给std :: remove_if,并让谓词检查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),int> const& elem) {
                                    return std::isnan(boost::get<0>(elem));
                               });

Live demo

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读