2017-07-03 3 views
1

So Iterieren einer Schnur über und unter Verwendung von operator[] oder Einfügen von Zeichen zu ändern, um den Iterator ungültig machen kann. IstWerden Zeichen in Zeichenfolgen umgewandelt, um Iteratoren ungültig zu machen?

, dass auch der Fall für eine Iteration so?

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 
    } 
} 

Dieser Code funktioniert auf gcc und msvc, aber ich weiß nicht, ob ich ihm vertrauen kann. Ich benutze C++ 14.

+1

_ ".. So Iteration über einen String und mit dem Operator [] oder Einfügen von Zeichen zu ändern, um den Iterator ungültig machen kann ..." _ __false .__ Beachten Sie, dass 'Operator []' nicht Zeichen in ein 'std eingeben :: string 'ändert nur vorhandene Zeichen. –

+0

@RichardCritten: Streng ** teilweise falsch **. Mit 'insert' werden Iteratoren ungültig; Mit '[]' wird nicht. –

Antwort

5

Sie ändern Zeichen der Zeichenfolge bestehenden, so dass es völlig sicher ist. Iteratoren werden ungültig gemacht, wenn sich die Größe des Zeichenfolgenspeichers ändern kann, z. Wenn Sie ein neues Zeichen anhängen, müssen Sie möglicherweise einen größeren Zeichenfolgenpuffer zuweisen, sodass alle Iteratoren, die auf den vorherigen Puffer verweisen, möglicherweise ungültig werden.

0

Sie können ein beliebiges Element einer Sammlung verändern, ohne seine Iteratoren ungültig zu machen. Ein String ist eine Sammlung von Zeichen, so dass diese Garantie gilt, auch über operator[] (entgegen der Behauptung in der Frage) zuweisen. Das Ändern des Werts eines Zeichens in einer Zeichenfolge unter Verwendung einer Referenz wie im selben Code ist gut definiert, und die Ergebnisse sind vorhersagbar.

Sie können Elemente nicht hinzufügen oder entfernen. Daher dürfen Sie Iteratoren nicht nach Funktionen wie replace oder 10 erneut verwenden.

Verwandte Themen