在 C++ 中查找向量的函数

Posted

技术标签:

【中文标题】在 C++ 中查找向量的函数【英文标题】:find function in c++ for a vector 【发布时间】:2014-08-16 20:33:54 【问题描述】:

好的,所以我是新手,我无法理解这一点。

我编写了这段代码,

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main (void)

    vector <int> a;
    int i;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    a.push_back(5);

    vector <int>::iterator position = find(a.begin(),a.end(),6);
    cout<<*position<<"\n";
    return 0;

我到处都读到find 函数如果没有找到任何东西会将迭代器返回到向量的末尾。因此,当我这样做并搜索向量中不存在的值6 时,它应该将迭代器返回到向量的末尾,实际上是5。在打印实际值时,它应该打印5,但它会打印0。为什么如果 find 在向量中没有找到与该值相关的任何内容,它会将迭代器返回到最后一个值,那么它会打印 0

【问题讨论】:

它返回你传入的结尾,即a.end()。取消引用 a.end() 是未定义的行为。 "t 应该将迭代器返回到向量的末尾,实际上是 5" - 不,不是,您需要阅读 std::vector::end() 的文档。另外,您认为将迭代器返回到最后一个元素是否有意义?那么如何区分“未找到”和“在最后位置找到”? 对不起,我无法区分。我的错。正如我所说,我对此并不陌生。我无法正确理解。 【参考方案1】:

不,它不会返回向量的结尾它会返回vector.end()

前者表示向量的最后一个元素,即 5。

后者vector.end()是past the end of the vector

这增加了一些混乱,因为vector.begin() 确实指向向量的第一个元素,但由于您可以迭代这些容器的方式,这是必要的。

【讨论】:

哦!我现在明白了。谢谢您的帮助。 :) @user3776323 如果是您需要的答案,请务必接受。【参考方案2】:

为什么如果 find 没有在向量中找到与该值相关的任何内容,则将迭代器返回到最后一个值,然后打印 0

0 是在取消引用向量的结束迭代器时得到的垃圾值。这是未定义的行为,因此您可能会得到任何数字。正确的代码如下所示:

vector <int>::iterator position = find(a.begin(),a.end(),6);
if (position != a.end()) 
    cout<<*position<<"\n";
 else 
    cout << "not found" << endl;

获得结果后,需要将其与a.end() 进行比较以查看结果是否有效。如果结果无效,则不能取消对迭代器的引用以避免未定义的行为。

【讨论】:

【参考方案3】:

正如您在the documentation for vector::end() 中看到的,end() 迭代器与向量中的最后一个元素不同。相反,它超过了最后一个元素。访问该元素会导致未定义的行为。

【讨论】:

以上是关于在 C++ 中查找向量的函数的主要内容,如果未能解决你的问题,请参考以下文章

查找对象属性是不是在对象的向量中 C++ [重复]

在给定键的地图向量中查找项目(C++)

在向量 STL C++ 中查找项目

在 C++ 中并行查找向量的第一个

在 C++ 中的向量中查找() stl

查找多个向量之间的公共元素(无整数元素)