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

标签 c++ algorithm

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

关于C++ 算法在条件为真时推进迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27783384/

相关文章:

c++ - undefined reference .. - mingw - winxp - eclipse juno

c++ - 绘制点之间的水平距离

algorithm - 在礼堂分配座位

algorithm - 如何在 O(nloglogn) 时间复杂度内对 range[1, logn**logn] 中的 n 个元素进行排序?

algorithm - 有哪些算法可以准确估计数据传输的预计到达时间?

algorithm - 找到一组覆盖在 3D 高度图上的圆的点

algorithm - 具有哈希表查找的四嵌套循环的大 theta

c++ - C++ 编译器如何将转义序列转换为实际字节?

c++ - 在 Qt Creator 中调试断言

c++ - 如何在 cocos2d-x 2.1.4 中复制 Sprite 的 Sprite