Ist es sicher, einen Container mit eigenen Iteratoren zuzuweisen?

10

Als Beispiel:

string s = "123";
s.assign(find(s.begin(),s.end(),'2'), s.end());

Ist das Verhalten des obigen Codes definiert? Oder führt es zu undefiniertem Verhalten?

Artavo
quelle

Antworten:

5

Ja. Diese Version von Assign ist definiert als

template<class InputIterator>
  constexpr basic_string& assign(InputIterator first, InputIterator last);

Einschränkungen : InputIterator ist ein Typ, der als Eingabe-Iterator qualifiziert ist.

Effekte : Entspricht: return assign (basic_string (first, last, get_allocator ()));

Dies zeigt eine temporäre Berechnung, bevor Änderungen vorgenommen werden.

Ein Programmierer
quelle
"äquivalent zu" bedeutet nicht, dass eine tatsächliche temporäre Datei erstellt werden muss. Die Semantik muss jedoch dieselbe sein. Und da die gezeigte Version gegen Selbstzuweisung sicher ist, muss auch die tatsächliche Implementierung erfolgen.
MSalters
@ MSalters. einverstanden. Ich wollte dies kommentieren und verlor mich dann bei dem Versuch, festzustellen, wie viel von der Allokatorverwendung entfernt werden konnte.
AProgrammer
Beachten Sie, dass dies spezifisch für Zeichenfolgen ist. Für Vektoren wäre es beispielsweise UB.
TC
@TC, könnten Sie den Standard zitieren?
Adler
1
@Adler, siehe diese Tabelle, auf die sich die Vektorbeschreibung bezieht.
AProgrammer