为什么这个向量迭代器不会失效?
我读过一些关于迭代器失效的帖子,似乎需要向量重新分配的插入会使迭代器无效。 也不应该删除矢量中间导致无效?
我对此没有清楚的理解,不确定为什么在从开始,中间和结束调整大小和擦除之后使用这些迭代器不会破坏它们:
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char** argv) {
vector<int> v;
v.reserve(10);
for (int i = 0; i < 10; i++)
v.push_back(i);
for (auto x = v.begin(); x != v.end(); x++) {
cout << *x << endl;
}
cout << endl << "RESIZE" << endl << endl;
for (int i = 10; i < 20; i++)
v.push_back(i);
for (auto x = v.begin(); x != v.end(); x++) {
cout << *x << endl;
}
cout << endl << "RESIZE 2" << endl << endl;
for (int i = 20; i < 200; i++)
v.push_back(i);
for (auto x = v.begin(); x != v.end(); x++) {
cout << *x << endl;
}
cout << endl << "REMOVES" << endl << endl;
v.erase(v.begin());
v.pop_back();
v.erase(v.begin() + 17);
for (auto x = v.begin(); x != v.end(); x++) {
cout << *x << endl;
}
return 0;
}
请注意,调用begin()或end()将始终提供一个理性的迭代器
但是像这样:
std:vector<int> v;
....
std::vector<int>::iterator i=v.begin();
v.erase(i);
std::cout << *i << std::endl; // i iterator was invalidated by erasing it
// trying to access it or increment it is undefined behaviour.
std::cout << *v.begin() << std::endl; // begin() provides always a sane iterator.
在你的代码中,总是在迭代器被重用时,没有对向量进行中间修改,所以不会失效。
迭代器可能会在调整大小和插入时失效。 擦除只会使擦除元素处或之后的迭代器失效。
至少,这些是std::vector
的解释规则。
上一篇: Why does this vector iterator not become invalidated?
下一篇: c++