因此迭代字符串并使用operator[]
或insert来更改字符会使迭代器无效。
这样的迭代也是如此吗?
std::string str = "ABCD";
for(auto&& c : str){
for(int i = 0; i < 3; ++i){
switch(c) {
case 'A':
c = 'B';
break;
case 'B':
c = 'C';
break;
/*...*/
}
//do something
}
}
此代码适用于gcc和msvc,但我不知道我是否可以信任它。我正在使用C ++ 14。
答案 0 :(得分:5)
您正在修改字符串的现有字符,因此它是完全安全的。当字符串存储的大小可能改变时,例如,迭代器无效。当你追加一个新字符时,可能需要分配一个更大的字符串缓冲区,所以指向前一个缓冲区的所有迭代器都可能变得无效。
答案 1 :(得分:0)
您可以修改集合的任何元素,而不会使其迭代器失效。字符串是字符的集合,因此适用此保证,包括通过operator[]
分配(与问题中的声明相反)。使用引用修改字符串中的字符值(如在相同的代码中)是明确定义的,结果是可预测的。
您可以做的是添加或删除元素,因此您不能在replace
或operator+=
等函数后重复使用迭代器。