首页 > 解决方案 > 使用条件迭代器插入向量

问题描述

假设我有一个vector包含各种条目的 a,我想将其插入另一个向量中,同时省略满足条件的条目。

例如,我想插入一个向量,同时省略所有三个。

{1, 3, 2, 3, 4, 5, 3} -> { /* previous content, */ 1, 2, 4, 5}

到目前为止我想出的使用std::partition,它不保留相对顺序并重新排列源向量。

std::vector<int> source({1, 3, 2, 3, 4, 5, 3});
std::vector<int> target;

auto partition = std::partition(std::begin(source),
                   std::end(source), [](const auto& a) { return a == 3; });
target.insert(std::begin(target), partition, std::end(source));

我正在寻找更多的是一个检查条件并在条件不满足时继续前进的迭代器。像这样的东西:

target.insert(std::begin(target),
              conditional_begin(source, [](const auto& a) { return a != 3; }),
              conditional_end(source));

我想一个conditional_end函数是必要的,因为它std::end会返回一个不同于conditional_begin.

也许我忽略了一些东西,所以我的问题是:

标签: c++iterator

解决方案


有没有其他简单的方法可以实现我的目标?

是的,标准已经内置了这个功能。您正在寻找的功能是std::copy_if.

std::vector<int> source({1, 3, 2, 3, 4, 5, 3});
std::vector<int> target;

std::copy_if(source.begin(), 
             source.end(), 
             std::back_inserter(target), [](auto val){ return val != 3; });

在这里, , 将为谓词返回的每个元素std::back_inserter(target)调用。push_backtargettrue


推荐阅读