有一对迭代器[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
。)
关于C++ 算法在条件为真时推进迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27783384/