string s;
cin>>s;
string::iterator it;
it=s.begin();
s.push_back('0');
s.erase(it);
cout<<s<<endl;
每次我输入一个 4 个字母的字符串,例如“milk”,结果都是核心转储。其他多于或少于 4 个字母的单词也可以很好地工作。怎么了 ?
string s;
cin>>s;
string::iterator it;
it=s.begin();
s.push_back('0');
s.erase(it);
cout<<s<<endl;
每次我输入一个 4 个字母的字符串,例如“milk”,结果都是核心转储。其他多于或少于 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 具有非常不寻常的迭代器失效语义。迭代器可以通过交换、保留、插入和擦除(以及等效于插入和/或擦除的功能,例如清除、调整大小、追加和替换)来无效。
但是,此外,第一次调用任何非常量成员函数,包括非常量版本的 begin() 或 operator[],可能会使迭代器无效。(这些迭代器无效规则的目的是为实现者提供更大的实现技术自由度。)在此实现中,begin()、end()、rbegin()、rend()、operator[]、c_str() 和 data( ) 不要使迭代器无效。