[C++] vectorの挙動検証 erase

[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