我有两个关于迭代器的问题。
我认为,一旦您为 STL 容器(例如向量或列表)定义了迭代器,如果您将元素添加到容器中,那么这些迭代器将无法访问它们。但是下面的代码定义了一个包含五个元素的列表,然后在每次循环迭代中添加另一个元素并导致无限循环:
#include <iostream> #include <list> using namespace std; int main() { list<int> ls; for(int i = 0; i < 5; i++) { ls.push_back(i); } int idx = 0; for(list<int>::iterator iter = ls.begin(); iter != ls.end(); iter++) { cout << "idx: " << idx << ", *iter: " << *iter << endl; ls.push_back(7); idx++; } }
但是,对向量执行相同操作会导致错误:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> vec; for(int i = 0; i < 5; i++) { vec.push_back(i); } int idx = 0; for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) { cout << "idx: " << idx << ", *iter: " << *iter << endl; vec.push_back(7); idx++; } }
我认为当必须调整向量容器的大小时,它会以 2 的幂次方进行,并且位于新的内存区域,这就是为什么如果向向量添加元素时不应该为向量定义迭代器(因为迭代器不会被传递到新的内存位置)。例如,我认为一个包含 16 个元素的向量,在调用 push_back 函数后,将分配 32 个元素的空间,整个向量将被重新定位。但是,以下代码没有发生这种情况。我是不是弄错了?
#include <iostream> #include <vector> using namespace std; int main() { vector<int> vec; for(int i = 0; i < 4; i++) { vec.push_back(i); cout << "address of vec: " << &vec << ", capacity: " << vec.capacity() << endl; } for(int i = 0; i < 20; i++) { vec.push_back(i); cout << "address of vec: " << &vec << ", capacity: " << vec.capacity() << endl; } }