关于c ++:在std :: vector中查找项目

Finding an item in std::vector

我想检查向量中是否存在元素,这样我就可以处理每种情况。我遇到了这个公式:

1
2
3
4
5
6
#include

if ( std::find(vector.begin(), vector.end(), item) != vector.end() )
   do_this();
else
   do that();

我不明白为什么我们在末尾需要vector.end(),找不到足够的(vector.begin(),vector.end(),item)来找到元素?


1
std::find(vector.begin(), vector.end(), item)

将返回迭代器,因此通过将其与

1
vector.end()

您实际上正在检查是否存在具有该项的此类迭代器。


I dont understand why do we need vector.end() at the end, isnt
find(vector.begin(), vector.end(), item) enough to find the element ?

找不到匹配的find的结果是指向所提供范围的结尾的迭代器,并且对于允许将其作为布尔状态进行比较的结尾迭代器,没有什么特别的地方。

find是一种通用的算法,适用于各种容器(包括可能在标准库之外的容器)。它的设计不仅仅是返回是否找到了一个元素——如果找到了,它返回指向该项的迭代器。因此,如果找不到元素,它不会返回空值或类似的值。它返回迭代器。

如果你真的经常做这种事情(我只建议你这样做,因为你在日常代码中引入了一些外来的东西),你可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
/// @return True if `val` is found in `[first, last)`
template <class Iterator, class Element>
bool contains(Iterator first, Iterator last, const Element& val)
{
    return std::find(first, last, val) != last;
}

...
if (contains(vector.begin(), vector.end(), item))
   do_this();
else
   do_that();


它检查值是否被实际找到。std::find()将迭代器返回到查询范围中的第一个元素。如果返回的值等于vector.end(),则表示它找不到该项。有关详细信息,请参阅此。