C ++算法在条件为真时推进迭代器
C++ algorithm to advance iterator while condition is true
有一对迭代器 [begin, end)
我想在条件为真但我没有达到 end
时前进 begin
。因为我不知道标准库中的任何 "direct" 算法来执行此操作,所以我正在使用:
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
可能矫枉过正。将 auto&&
替换为存储的类型 const&
并将 std::decay_t<?>
替换为 typename std::decay<?>::type
如果你不是 C++14。)
我觉得这个用成语最容易表达...
while (condition (begin++));
如果您想检查结束迭代器,只需将其添加到条件中...
while (begin != end && condition(begin++));
这是一个不错的小技巧(可以追溯到 C),因为它适用于技术上什至不是迭代器的东西,例如...
// Consume leading whitespace
while (isspace(ch = getchar()));
有一对迭代器 [begin, end)
我想在条件为真但我没有达到 end
时前进 begin
。因为我不知道标准库中的任何 "direct" 算法来执行此操作,所以我正在使用:
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
可能矫枉过正。将 auto&&
替换为存储的类型 const&
并将 std::decay_t<?>
替换为 typename std::decay<?>::type
如果你不是 C++14。)
我觉得这个用成语最容易表达...
while (condition (begin++));
如果您想检查结束迭代器,只需将其添加到条件中...
while (begin != end && condition(begin++));
这是一个不错的小技巧(可以追溯到 C),因为它适用于技术上什至不是迭代器的东西,例如...
// Consume leading whitespace
while (isspace(ch = getchar()));