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

Odd values printed when dereferencing the end iterator of a vector

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

这一行调用了未定义的行为:

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

取消引用 end() 迭代器是未定义的行为。因此,一切皆有可能。

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

希望对您有所帮助!

vec.end() 不指向最后一个元素,但有点 "behind" 最后一个。

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

vec.find returns 如果找不到搜索到的元素,则结束迭代器。

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