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)合适。

(forwarddecay_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()));