イテレータに関して 2 つの質問があります。
ベクターやリストなどのSTLコンテナーにイテレーターを定義すると、コンテナーに要素を追加すると、これらのイテレーターはそれらにアクセスできなくなると思いました。ただし、次のコードは 5 つの要素のリストを定義し、各ループ反復で別の要素を追加するため、無限ループになります。
#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 のべき乗でサイズ変更を行い、新しいメモリ領域に配置されると考えました。イテレータは新しいメモリ位置に渡されません)。たとえば、push_back 関数を呼び出した後、16 要素を含むベクターは、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; } }