这是gcc std::count_if代码

template<typename _InputIterator, typename _Predicate>
  typename iterator_traits<_InputIterator>::difference_type
  count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred)
 {
  [snip]
  typename iterator_traits<_InputIterator>::difference_type __n = 0;
  for (; __first != __last; ++__first)
    if (__pred(*__first))
      ++__n;
  return __n;
}

我的问题:使用起来会更好(即更快)吗
__n += __pred(*__first); // instead of the if statement

此版本始终执行添加操作,但不执行分支操作。

最佳答案

您给提供的替换不等于,因为对谓词的限制比您想象的要少得多:

  • 可以在条件上下文中使用的任何内容(可以在上下文中转换为bool),都是谓词的有效返回类型(将explicit转换为bool就足够了)。
  • 返回类型可以很有趣地添加到迭代器的差值类型中。



  • 给您带来替代消化不良的最有可能的返回将是标准整数类型,且值既不是0也不是1。

    另外,请记住,当今编译器实际上可以进行非常好的优化(尤其是C++编译器需要进行优化,并且所有模板内容都应深层地进行)。

    关于c++ - 如果没有if,std::count_if会更快吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26245969/

    10-11 23:14
    查看更多