STL算法全部还是任何功能?

时间:2010-08-24 18:40:09

标签: c++ stl

是否有任何接近Haskell的全部或任何功能作为STL的一部分?如果没有,下面是一个很好的实现(我注意到如果迭代器是随机访问的话,sgi STL执行了部分特化,虽然我没有打扰过这个)?

template <typename InputIterator, typename Predicate>
inline bool all(InputIterator first, InputIterator last, Predicate pred) {
  while (first != last) {
    if (!pred(*first)) {
      return false;
    }
    ++first;
  }
  return true;
}

类似地,如何最好地转换为迭代两个序列,并在BinaryPredicate为所有人返回true时返回true,否则返回false?我知道这是相对微不足道的,但似乎这应该由算法提供,我想确保我不会忽略某些东西。

4 个答案:

答案 0 :(得分:8)

目前C ++中没有allany算法,但C ++ 0x将std::all_ofstd::any_of算法添加到C ++标准库中。您的实施可能已经支持这些。

由于这两种算法都需要测试范围内的每个元素(至少在它们找到匹配或不匹配之前),因此没有任何理由将它们专门用于不同类型的迭代器:与前向迭代器一起使用时的性能应该与随机访问迭代器一起使用时的性能相同。

all的实施很好; Visual C ++ all_of实现实际上是相同的,除了它使用for循环而不是while循环。

  

如何最好地转换为迭代两个序列,并在BinaryPredicate为所有人返回true时返回true,否则返回false?

这是std::equal的作用。您需要先检查范围的大小,以确保它们的大小相同。

答案 1 :(得分:5)

这看起来几乎相当于std::find_if,谓词与我相反。

答案 2 :(得分:2)

你可以使用std :: find_if like,如果谓词对所有元素都返回false,则返回Iterator last,否则返回它返回true的元素。

Iterator it = std::find_if (container.begin (), container.end (), predicate);
if (it != container.end ())
    // One of them doesn't match

答案 3 :(得分:-1)

来自BOOST的foreach怎么样?它不是STL,但适用于任何平台。