将字符移动到字符串中会使迭代器无效吗?

Does moving characters into string invalidate iterators?

因此遍历字符串并使用 operator[] 或插入来更改字符会使迭代器无效。

这样的迭代也是这样吗?

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。

您正在修改字符串的现有字符,因此它是完全安全的。当字符串存储的大小可能发生变化时,迭代器将失效,例如当你追加一个新字符时,可能需要分配一个更大的字符串缓冲区,所以所有指向前一个缓冲区的迭代器都可能变得无效。

您可以修改集合的任何元素而不会使它的迭代器失效。字符串是字符的集合,因此适用此保证,包括通过 operator[] 分配(与问题中的声明相反)。使用引用修改字符串中字符的值,就像在同一代码中一样,定义明确,结果可预测。

你不能做的是添加或删除元素,所以你不能在replaceoperator+=.

等函数之后重复使用迭代器