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

use*_*213 1 c++ string iterator move

因此,遍历字符串并使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码适用于gcc和msvc,但我不知道我是否可以信任它.我正在使用C++ 14.

use*_*670 5

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