std :: count和std :: find之间的性能差异

时间:2015-01-22 22:02:34

标签: c++ c++11 vector stl

这可能是一个愚蠢的问题,但我想检查一个容器(在这种情况下是std::vector bool,但更广泛的方法会更好)来检查一个值是否存在。据我所知,运行时间std::countstd::find都是线性的,如果项目在范围内,计数可能会更慢,但我认为如果对象存在,两者应该相同,但我可以看到编译器可以矢量化std::count因此使std::count运行得更快的概率。我是否正确的第一个假设是两者都会运行相同,或者第二个假设是,编译器可以向量化std::count 为真?

2 个答案:

答案 0 :(得分:2)

如果您要查找的项目 ,则countfind都将遍历整个序列,因此两者的速度大致相同。

如果您在该范围内看的项目find将在找到后返回。所以find会更快,找到的元素越接近序列的前面。

一般来说,实施不会&#34;矢量化&#34;这个算法。但是,在std::vector<bool>的情况下,一个实现(libc++)会进行优化。它优化count find以一次查看64位(在64位平台上),因此这两个操作都将大大加快std::vector<char>上的相同操作。这里描述了这些优化:

http://howardhinnant.github.io/onvectorbool.html

我不是正面的(如果我错了,请随时纠正我,我很想错),但我认为libc ++是目前唯一可以进行优化的实现。< / p>

答案 1 :(得分:0)

为了找到这个问题的答案,我已经看了两个函数的行为。从我在C ++ Reference上可以找到的内容,std :: count函数的行为如下:

template <class InputIterator, class T>
  typename iterator_traits<InputIterator>::difference_type
    count (InputIterator first, InputIterator last, const T& val)
{
  typename iterator_traits<InputIterator>::difference_type ret = 0;
  while (first!=last) {
    if (*first == val) ++ret;
    ++first;
  }
  return ret;
}

std :: find函数如下所示:

template<class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val)
{
  while (first!=last) {
    if (*first==val) return first;
    ++first;
  }
  return last;
}

这意味着std :: count函数将始终遍历整个向量,即使只有一个值可以找到。但是,当找到值时,std :: find函数实际上会停止。这意味着,如果您只想知道向量是否包含值,那么平均std :: find函数将比std :: count函数更快。如果你也想知道找到了多少,std :: count函数是最好的解决方案,虽然我不认为这是你的意图。

总的来说,这意味着std :: find函数将与std :: count函数一样快或更快。

来源: http://www.cplusplus.com/reference/algorithm/find/ http://www.cplusplus.com/reference/algorithm/count/