在std::vector中查找项

Finding an item in std::vector

本文关键字:查找 vector std      更新时间:2023-10-16

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

#include <algorithm>
if ( std::find(vector.begin(), vector.end(), item) != vector.end() )
   do_this();
else
   do that();

我不明白为什么我们在末尾需要vector.end(),find(vector.begin(),vector.eend(),item)不足以找到元素吗?

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

将返回一个迭代器,因此通过将其与进行比较

vector.end()

您实际上是在检查是否存在这样一个具有该项的迭代器。

我不明白为什么我们最后需要vector.end(),不是吗find(vector.begin(),vector.end(),item)足以找到元素?

find在找不到匹配时的结果是一个迭代器指向所提供范围的末尾,并且末尾迭代器没有什么特别之处,可以像布尔状态一样进行比较。

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

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

/// @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(),则表示它没有找到该项
有关详细信息,请参阅此。