C++ Set迭代器问题:为何循环前后解引用*it的值从1变为5?
C++ set迭代器行为差异原因
你贴出的代码如下:
set <int> my_set{3,1,4,2,5}; set<int>::iterator it = my_set.begin(); cout << "beginning of set " << *it << endl; for(; it != my_set.end(); ++it) cout << *it << endl; cout << "Beginning of set " << *it << endl;
具体原因拆解
std::set是默认升序排序的有序关联容器,你初始化的{3,1,4,2,5}存入set后会自动排序为1、2、3、4、5的序列。- 初始赋值
it = my_set.begin()时,begin()返回指向set第一个元素的迭代器,对应值为1,所以第一次输出*it结果为1,属于正常表现。 - for循环的执行逻辑是:每次先判断
it != my_set.end()是否成立,成立就执行循环体输出*it,再执行++it移动迭代器。当it指向最后一个元素5时,判断条件成立,输出5后执行++it,此时it就移动到了my_set.end()的位置,下一次条件判断不成立,循环退出。 - 循环退出后的
it是尾后迭代器,C++标准明确规定对尾后迭代器解引用属于未定义行为,没有可预期的固定结果。你观察到输出5只是当前编译环境的偶然表现,换个环境可能出现乱码、程序崩溃等完全不同的结果,这个输出没有实际参考意义。
如果需要循环结束后再次输出set的首元素,需要重新执行it = my_set.begin()赋值操作,不能直接复用循环结束后的迭代器。
内容的提问来源于stack exchange,提问作者Saref91
相关产品推荐
相关产品推荐

