我有一个存储{1,2,3,4,5}的向量。我试图打印*(vec.end())
并取回结果6.我不知道如何解释这个。同样,调用vec.find(500)
会得到结果6.为什么我会得到这个数字?
#include<iostream>
#include<iterator>
#include<set>
#include<map>
int main()
{
int a[] = {1,2,3,4,5};
std::set<int> set1(a,a+sizeof(a)/sizeof(int));
for (std::set<int>::iterator itr=set1.begin();itr!=set1.end();++itr){
std::cout << *itr << std::endl;
}
//std::pair<std::set<int>::iterator, bool> ret;
//ret = set1.insert(1);
//std::cout << *(ret.first) << "first;second" << ret.second << std::endl;
std::set<int>::iterator itr1 = set1.begin();
set1.insert(itr1,100);
std::advance(itr1,3);
std::cout << *itr1 << std::endl;
std::cout << *(set1.find(500)) << std::endl;
std::cout << *(set1.end()) << std::endl;
}
答案 0 :(得分:5)
此行调用未定义的行为:
std::cout << *(set1.end()) << std::endl;
取消引用end()
迭代器是未定义的行为。因此可以预期任何事情。
答案 1 :(得分:3)
在C ++容器中,end
迭代器为迭代器提供了一个超出容器元素末尾的迭代器。取消引用迭代器是不安全的,因为它实际上并没有查看元素。如果你试图这样做,你会得到未定义的行为 - 它可能打印出一些合理的东西,但它可能会立即使程序崩溃。
希望这有帮助!
答案 2 :(得分:3)
永远不要尝试使用任何stl容器的end()
,因为它没有指向有效数据。它始终指向位于实际数据之后的一块内存。仅使用end()
检查迭代器是否已结束。此图像清楚地说明了end()
在默认(非反转)范围内的位置:
答案 3 :(得分:2)
vec.end()
没有指向最后一个元素,但有点&#34;背后&#34;最后一个。
您没有访问向量中的最后一个元素。相反,你正在取消引用&#34;无效&#34;迭代器,它是未定义的行为,在这种情况下结果是向量中的无效索引。
如果找不到搜索到的元素, vec.find
将返回结束迭代器。