Ale*_*lex 3 c++ iterator c++11
这个问题很可能是重复的,但我还没有找到关于这个问题的任何内容。
为什么增加iteratora 中最后位置的 avector会使其不等于vector.end()?
或者,换句话说,为什么会正常执行:
int main() {
vector<string> vec = {"ve"};
for (auto it = vec.begin(); it != vec.end(); it++) {}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然这会进入无限循环:
int main() {
vector<string> vec = {"ve"};
for (auto it = vec.begin(); it != vec.end(); it++) { it++; }
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和这个:
int main() {
vector<string> vec = {"ve"};
for (auto it = vec.begin(); it != vec.end(); it++) {
cout << (it == vec.end()) << " ";
cout << (*it == "ve") << endl;
it++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
导致SEGFAULT打印:
0 1
0
Run Code Online (Sandbox Code Playgroud)
所以,it事实上,增加了,因此它的内容变成空(根据调试器优化),但它并没有变得等于vec.end()。为什么?
想象一下it指向 before vec.end(),据说是循环的最后一次迭代for。
it != vec.end();将是true,因此循环将继续。it++;体内被执行。it == vec.end()现在。it++从for循环头开始执行。超出it一分。 vec.end()vec.end()点超出 的最后一个元素vec,该元素仍然定义良好。vec.end() + 1( 的最终值it)超出 的最后一个元素两个vec点,这是未定义的行为。
这意味着取消引用迭代器会访问未分配的内存(解释了分段错误)。再次出现未定义的行为。
| 归档时间: |
|
| 查看次数: |
1336 次 |
| 最近记录: |