c++ - 使用条件迭代器插入向量
问题描述
假设我有一个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
.
也许我忽略了一些东西,所以我的问题是:
- 标准库是否提供类似的东西?
- 有没有其他简单的方法可以实现我的目标?
- 有没有一种简单的方法来实现条件迭代器功能?
解决方案
有没有其他简单的方法可以实现我的目标?
是的,标准已经内置了这个功能。您正在寻找的功能是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_back
target
true
推荐阅读
- c++ - 与 Windows 相比,Linux 上的分数不同......内存问题?
- php - 通过字符串获取数组值
- python - 如何从数据框 pandas 验证 Pan 卡号
- python - 在 GUI 中分析 CSV 文件
- java - 直播无法使用 AGORA SDK v3.2.0 我不知道如何实现或将其集成到网站
- sql - 请求中的值的总和
- vaadin - 水平分割面板 - 以像素为单位获取宽度
- ios - 最新 Xcode 更新后导航链接不起作用
- java - 有没有办法在 android 的可绘制矢量中移动(翻译)一个组?
- r - 使用来自各种来源的 R igraph all_simple_paths 并逐步构建 Origin Destination 路径