C++算法在条件为真时推进迭代器

C++ algorithm to advance iterator while condition is true

本文关键字:迭代器 算法 条件 C++      更新时间:2023-10-16

有一对迭代器[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)。

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