这可能是一个愚蠢的问题,但我想检查一个容器(在这种情况下是std::vector
bool
,但更广泛的方法会更好)来检查一个值是否存在。据我所知,运行时间std::count
和std::find
都是线性的,如果项目在范围内,计数可能会更慢,但我认为如果对象存在,两者应该相同,但我可以看到编译器可以矢量化std::count
和因此使std::count
运行得更快的概率。我是否正确的第一个假设是两者都会运行相同,或者第二个假设是,编译器可以向量化std::count
为真?
答案 0 :(得分:2)
如果您要查找的项目 不,则count
和find
都将遍历整个序列,因此两者的速度大致相同。
如果您在该范围内看的项目,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/