とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

erase, std::list

STL―標準テンプレートライブラリによるC++プログラミング 第2版
erase の時に無効になるイテレータは erase された要素を指すイテレータのみ。前や後ろのイテレータは有効なまま。

// P148 ex06-11.cpp
#include<string>
template<typename Container>
Container make(const char* s){
 const std::string str(s);
 return Container(str.begin(), str.end());
}
#include<iostream>
#include<list>
#include<algorithm>
#include<cassert>
int main(){
 using std::cout;
 using std::endl;
 using std::list;
 using std::find;
 cout << "Demonstrating STL list erase function." << endl;
 list<char> l(make<list<char> >("remembering"));
 list<char>::const_iterator i = find(l.begin(), l.end(), 'i');

 l.erase(i++); // 後ろもイテレータは有効のまま
 assert(l == make<list<char>>("rememberng"));
 l.erase(i++);
 assert(l == make<list<char>>("rememberg"));
 l.erase(i++);
 assert(l == make<list<char>>("remember"));
 l.erase(l.begin());
 assert(l == make<list<char>>("emember"));
 l.erase(l.begin());
 assert(l == make<list<char>>("member"));
 cout << " --- Ok." << endl;
}