在 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++ 中查找向量的函数的主要内容,如果未能解决你的问题,请参考以下文章