[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]
前回、前々回と同様の検証をerase関数で実施しました。
erase関数の場合は、メモリアドレスは削除箇所から前の要素は変わらず、削除箇所から後ろは前に詰める形になります。
イテレータの再設定は必要です。再設定しないとwhile文ではデータが格納されていると認識している旧endを延々と探すことになり、ループが止まりません。
#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++;
}
// 3番目の要素を削除
vec.erase(vec.begin() + 2);
// イテレータ再設定
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
0x13e6068c0
0x13e6068c4
0x13e6068c8
0x13e6068cc
0x13e6068d0
vector削除後
0x13e6068c0
0x13e6068c4
0x13e6068c8
0x13e6068cc
1
2
4
5