插入后使用set :: begin()迭代器

Jos*_*eld 3 c++ containers iterator set

请考虑以下代码:

std::set<int> s;
auto it = s.begin();
s.insert(1);
s.insert(2);
std::cout << *it << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出(至少对我而言)是2.这里发生了什么事?什么it时候我取消引用它的状态?

我知道当我调用begin()一个空集时,我得到一个等价的迭代器end().我也知道调用inserta set不会使其迭代器失效.迭代器是否保持等效,end()即使我现在已经插入元素set,所以现在我得到未定义的行为?这是由标准定义的吗?

Jam*_*lis 7

当你s.begin()在这里调用时,它会返回一个结束迭代器,因为容器是空的.插入符号不会使此迭代器失效:每次插入后,此迭代器仍然是结束迭代器.

取消引用此迭代器会导致程序显示未定义的行为(无法取消引用结束迭代器).