取消引用向量的结束迭代器时打印的奇数值

时间:2015-07-10 22:36:39

标签: c++ stl iterator

我有一个存储{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;
}

4 个答案:

答案 0 :(得分:5)

此行调用未定义的行为:

std::cout << *(set1.end()) << std::endl;

取消引用end()迭代器是未定义的行为。因此可以预期任何事情。

答案 1 :(得分:3)

在C ++容器中,end迭代器为迭代器提供了一个超出容器元素末尾的迭代器。取消引用迭代器是不安全的,因为它实际上并没有查看元素。如果你试图这样做,你会得到未定义的行为 - 它可能打印出一些合理的东西,但它可能会立即使程序崩溃。

希望这有帮助!

答案 2 :(得分:3)

永远不要尝试使用任何stl容器的end(),因为它没有指向有效数据。它始终指向位于实际数据之后的一块内存。仅使用end()检查迭代器是否已结束。此图像清楚地说明了end()在默认(非反转)范围内的位置:

STL Container's begin and end

答案 3 :(得分:2)

vec.end()没有指向最后一个元素,但有点&#34;背后&#34;最后一个。

您没有访问向量中的最后一个元素。相反,你正在取消引用&#34;无效&#34;迭代器,它是未定义的行为,在这种情况下结果是向量中的无效索引。

如果找不到搜索到的元素,

vec.find将返回结束迭代器。