string s;
cin>>s;
string::iterator it;
it=s.begin();
s.push_back('0');
s.erase(it);
cout<<s<<endl;
「milk」などの 4 文字の文字列を入力するたびに、コア ダンプが発生します。4 文字以上または以下の他の単語でも問題なく使用できます。どうしたの ?
string s;
cin>>s;
string::iterator it;
it=s.begin();
s.push_back('0');
s.erase(it);
cout<<s<<endl;
「milk」などの 4 文字の文字列を入力するたびに、コア ダンプが発生します。4 文字以上または以下の他の単語でも問題なく使用できます。どうしたの ?
0
最後に追加した後、イテレータを割り当ててみてください
string s;
cin>>s;
s.push_back('0');
string::iterator it;
it=s.begin();
s.erase(it);
cout<<s<<endl;
文字列を変更すると、文字列から生成されたイテレータはすべて無効になります。
技術的には、文字列のサイズが変更された場合にのみ無効になります。
ただし、文字列のサイズ変更を防止するための明示的な予防策を講じない限り、文字列にコンテンツを追加してサイズを大きくすると、イテレータが無効になると想定する必要があります。
参照: www.sgi.com/tech/stl/basic_string.html
また、C++ 標準によると、basic_string には非常に珍しい反復子無効化セマンティクスがあることにも注意してください。イテレータは、swap、reserve、insert、および erase によって (および、clear、resize、append、replace など、insert および/または erase と同等の関数によって) 無効化される場合があります。
ただし、さらに、begin() または operator[] の非 const バージョンを含む非 const メンバー関数への最初の呼び出しは、反復子を無効にする可能性があります。(これらのイテレータ無効化規則の意図は、実装技術において実装者により大きな自由を与えることです。) この実装では、begin()、end()、rbegin()、rend()、operator[]、c_str()、および data( ) イテレータを無効にしません。