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

问题描述:

因此,遍历字符串并使用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。

+1

_“..因此,遍历字符串并使用运算符[]或插入来更改字符会使迭代器无效...”_ __false .__注意'operator []'不能将字符插入到std ::字符串'只修改现有的字符。 –

+0

@RichardCritten:严格**部分错误**。使用'insert'会使迭代器失效;使用'[]'不会。 –

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

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

你不能做的是添加或删除元素,所以你不能在诸如replaceoperator+=之类的函数之后重复使用迭代器。