Der C++ - Standard legt nicht fest, wie deque implementiert wird. Es ist nicht erforderlich, neuen Speicherplatz zuzuweisen, indem ein neuer Block zugewiesen und an die vorherigen angekettet wird. Es ist lediglich erforderlich, dass die Einfügung an jedem Ende zu einer konstanten Zeit amortisiert wird.
So, während es ist einfach zu sehen, wie Deque so implementieren, dass es die Garantie gibt, die Sie wollen [*], das ist nicht die einzige Möglichkeit, es zu tun.
[*] Iteratoren haben einen Verweis auf ein Element sowie einen Verweis auf den Block, in dem sie sich befinden, damit sie bei Erreichen der Blöcke weiter vorwärts/rückwärts gehen können. Plus ich nehme einen Verweis auf die Deque selbst, so dass operator+
Konstante Zeit sein kann wie erwartet für Random-Access-Iteratoren - eine Kette von Links von Block zu Block zu folgen ist nicht gut genug.
iirc, gccs deque-Implementierung enthält ein Array von Zeigern auf diese Blöcke ... Wenn das Array neu zugewiesen werden muss, können Iteratoren ungültig werden. Vielleicht ist das der Grund? Ich bin mir nicht sicher ... Das erklärt zumindest, warum die Einfügungen zu beiden Enden Iteratoren ungültig machen, aber keine Referenzen/Zeiger auf Elemente. –