[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]
vectorの各要素のメモリアドレスおよび要素を追加したときのアドレスの変化をチェックしました。
push_back関数で要素を追加すると、16バイト先のメモリアドレスから再度要素を配置することがわかりました。イテレータを設定していた場合はそれが使えなくなるため、再度設定が必要になります。
#include <iostream>
#include <vector>
using std::to_string;
int main()
{
std::vector<int> vec{ 1, 2, 3, 4, 5};
std::vector<int>::iterator itr = vec.begin();
// vector各要素のアドレスを出力
std::cout << "vector" << std::endl;
while (itr != vec.end())
{
std::cout << &(*itr) << std::endl;
itr++;
}
// 要素を追加
vec.push_back(6);
// イテレータを再度設定
std::vector<int>::iterator itr2 = vec.begin();
// 再度アドレス出力
std::cout << "vector要素追加後" << std::endl;
while (itr2 != vec.end())
{
std::cout << &(*itr2) << std::endl;
itr2++;
}
for (int num:vec)
{
std::cout << to_string(num) << std::endl;
}
}
--------------------------------------------------
出力例
--------------------------------------------------
vector
0x1596068c0
0x1596068c4
0x1596068c8
0x1596068cc
0x1596068d0
vector要素追加後
0x1596068e0
0x1596068e4
0x1596068e8
0x1596068ec
0x1596068f0
0x1596068f4
1
2
3
4
5
6