【发布时间】:2015-07-23 01:25:21
【问题描述】:
我有 3 个使用 c++ 迭代器的场景,它们一起让我感到困惑。
这是我的主要代码:
int arr[] = {13,20,40};
set<int> st(arr,arr+3);
auto it=st.begin();
auto tmp=it;
it++;
st.erase(it);
//scenarios here
1-如果我写下面,结果是20,为什么?
cout << *tmp << endl;
2- 如果我向前移动指针,结果是 13,为什么?
tmp++;
cout << *tmp << endl;
3- 如果我向后移动指针,结果也是13,为什么它和向前移动一样?
tmp--;
cout << *tmp << endl;
4- 最后,如果我不是从集合中间擦除某些东西,而是擦除起始项,结果是一个随机数。
auto it=st.begin();
auto tmp = it;
st.erase(it);
cout << *tmp << endl;//result: 13
tmp++;
cout << *tmp << endl;//result: random number
如果您知道任何与此问题相关的有关 c++ 中迭代器的有用链接,请提及。
【问题讨论】:
-
所有问题的答案都是“未定义的行为”查找iterator invaidation rules
-
erase 将删除指向节点并返回下一个节点的迭代器并分配给它。这就是为什么你得到 20,即下一个节点的值。
-
@paper.plane,实际上我在擦除部分之前忘记写了++,我编辑了代码。看来您的猜测是错误的,因为 20 是已经删除的迭代器的值。
-
我同意答案可能在重复的问题中,但我不认为它是重复的,因为答案没有清楚地解释这个案例的具体原因,至少我认为提供的答案太长了,找哪个段落包含这个案例的答案对初学者不友好
-
@amuse,实际上通过阅读建议链接中的解释,我完全理解了它。当他们说这是“未定义的行为”时,这是完全合理的,