C++算法在条件为真时推进迭代器
C++ algorithm to advance iterator while condition is true
有一对迭代器[begin, end)
我想在条件为真且未达到end
时前进begin
。由于我不知道标准库中的任何"直接"算法来执行此操作,因此我正在使用:
std::find_if_not(begin, end, condition);
但我的问题是,函数的名称并没有表达我在条件为真的情况下推进begin
的意图。
C++标准库中是否有任何算法可以在条件为真时推进迭代器?
C++14:
template<class...Args>
auto advance_while_true( Args&&... args ) {
return std::find_if_not( std::forward<Args>(args)... );
}
但实际上,只需使用find_if_not
. 该名称可能与您对问题的描述不符,但作为std
库算法,它相对有名。
如果条件很常见,请编写一个包装器,该包装器接受两个(寺庙化的)迭代器,并将条件包含在自身内部。
template<class Iterator>
std::decay_t<Iterator> advance_while_foo( Iterator first, Iterator last ) {
return std::find_if_not( std::forward<Iterator>(first), std::forward<Iterator>(last),
[](auto&& x) {
return foo(x);
}
);
}
它既使用std
算法作为胆量(这意味着它可能比你自己写更好),并给它一个理论上应该是合适的名称(foo
)。
(forward
和decay_t
可能是矫枉过正。 如果不是 C++14,请将 auto&&
替换为存储的类型 const&
,std::decay_t<?>
替换为 typename std::decay<?>::type
。
我认为这最容易用成语表达......
while (condition (begin++));
如果您想检查结束迭代器,只需将其添加到条件中即可......
while (begin != end && condition(begin++));
这是一个很好的小技巧(可以追溯到 C),因为它适用于甚至不是技术迭代器的东西,比如......
// Consume leading whitespace
while (isspace(ch = getchar()));
相关文章:
- 如何为指向复杂值的迭代器专门化算法?
- 为什么范围算法与 std 的迭代器不兼容?
- 当迭代器(输入参数)通常不是constexpr时,constexpr算法真的有用吗
- 在 stl 算法中移动迭代器
- 指针算法是否适用于迭代器?
- 用于双向迭代器的高德纳-莫里斯-普拉特算法
- 在目标函数中使用迭代器的 STL 算法
- stl风格的算法:如何管理输出迭代器
- 为什么C++ STL 中算法、迭代器和容器是分开的
- C++前向迭代器算法
- 具有四个迭代器的类似复制的算法
- C++算法在条件为真时推进迭代器
- 将我的自定义迭代器与 STL 算法一起使用
- 哪些 STL 算法可以安全地与单通道输入迭代器一起使用
- 在find_if算法中将 char* 转换为字符串::迭代器
- 从搜索算法返回的约定 - 索引或迭代器
- 常量迭代器与可变迭代器:相同的算法不同的代码
- 自定义迭代器和 STL 算法出错
- 为什么STL算法使用指针比std::向量迭代器快得多
- 反向迭代器算法