Standard C++ nie określa sposobu implementacji deque. Nie jest wymagane przydzielanie nowej przestrzeni przez przydzielanie nowej porcji i łączenie jej z poprzednimi, wszystko, co jest wymagane, to to, że wstawienie na każdym końcu jest amortyzowane stałym czasem.
Tak więc, chociaż łatwo jest zobaczyć, jak wprowadzić deque w taki sposób, że daje gwarancję, którą chcesz [*], nie jest to jedyny sposób, aby to zrobić.
[*] Iteratory mają odniesienie do elementu, a także odnośnik do bloku, w którym mogą się poruszać w przód/w tył od końca bloku, gdy do niego dojdą. Dodatkowo przypuszczam, że odniesienie do samej pamięci, tak aby operator+
mogła być stała, zgodnie z oczekiwaniami dla iteratorów o dostępie swobodnym - po łańcuchach łączy od bloku do bloku nie jest wystarczająco dobra.
iirc, implementacja deque'a utrzymuje tablicę wskaźników do tych bloków ... Jeśli tablica musi zostać ponownie przydzielona, iteratory mogą stać się nieważne. Może to jest powód? Nie jestem pewien ... To przynajmniej wyjaśnia, dlaczego wstawienia do obu końców unieważniają iteratory, ale nie odwołania/wskaźniki do elementów. –