2017-07-03 51 views
1

因此,遍歷字符串並使用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'會使迭代器失效;使用'[]'不會。 –

回答

5

您正在修改字符串的現有字符,因此它是完全安全的。當字符串存儲器的大小可能改變時,迭代器無效。當你追加一個新的字符時,可能需要分配一個更大的字符串緩衝區,所以指向前一個緩衝區的所有迭代器可能會失效。

0

您可以修改集合的任何元素而不會使其迭代器失效。字符串是字符的集合,所以此保證適用,包括通過operator[]進行分配(與問題中的索賠相反)。在同一代碼中使用引用修改字符串中字符的值是明確定義的,並且結果是可預測的。

你不能做的是添加或刪除元素,所以你不能在諸如replaceoperator+=之類的函數之後重複使用迭代器。