std::deque
Zdefiniowane w nagłówku <deque> | ||
template< class T, | (1) | |
std::deque (double-ended queue, dwustronnie zakończona kolejka) jest indeksowanym kontenerem sekwencyjnym, pozwalającym na szybkie dodawanie i usuwanie elementów zarówno na swoim końcu, jak i początku. Dodatkowo, usuwanie ani dodawanie na którymkolwiek z końców deque nigdy nie unieważni wskaźników ani referencji na pozostałe elementy.
W przeciwieństwie do std::vectora, elementy kontenera deque nie są przechowywane w ciągłej pamięci: typowa implementacja używa ciągu samodzielnie alokowanych tablic o ustalonym, niezmiennym rozmiarze, wraz z dodatkowym bookkeeping, co oznacza, że dostęp do elementu po indeksie wymaga dwóch dereferencji wskaźnika, w przeciwieństwie do wektora, u którego dostęp do elementu po indeksie wykonuje tylko jedną dereferencję.
Pamięć deque jest automatycznie rozszerzana lub kurczona, zależnie od potrzeb. Rozszerzenie deque jest mniej kosztowne niż rozszerzenie std::vectora , ponieważ nie pociąga za sobą kopiowania istniejących elementów do nowego miejsca w pamięci. Z drugiej strony, kontenery deque mają zwykle duży minimalny koszt pamięciowy; deque zawierająca zaledwie jeden element musi zaalokować całą wewnętrzną tablicę (np. 8 razy wielkość obiektu na 64-bitowym libstdc++; większa z wartości (16 razy wielkość obiektu i 4096 bajtów) na 64-bitowym libc++).
Złożoność obliczeniowa (wydajność) standardowych operacji na deque jest następująca:
- Dostęp bezpośredni do elementu - stała O(1)
- Wstawienie lub usunięcie elementu na końcu lub początku - stała O(1)
- Wstawienie lub usunięcie elementu - liniowa względem odległości do bliższego z końców O(n)
std::deque spełnia wymagania Container, AllocatorAwareContainer, SequenceContainer i ReversibleContainer.
Spis treści |
[edytuj]Parametry szablonu
T | - | Typ elementów.
| ||||
Allocator | - | Alokator wykorzystywany do uzyskiwania/zwalniania pamięci i tworzenia/niszczenia elementów w tej pamięci. Typ musi spełniać wymogi Allocator. Zachowanie jest niezdefiniowane, jeśli Allocator::value_type nie jest identyczny jak T. |
[edytuj]Unieważnienie iteratorów
Operacja | Unieważnia |
---|---|
Operacje odczytu | Nigdy |
swap, std::swap | Wartość end() może być unieważniona (zależne od implementacji) |
shrink_to_fit, clear, insert, emplace, push_front, push_back, emplace_front, emplace_back | Zawsze |
erase | Jeśli usuwane elementy znajdują się na początku - tylko do usuwanych elementów Jeśli usuwane elementy znajdują się na końcu - tylko do usuwanych elementów i iterator zakońcowy |
resize | Jeśli nowy rozmiar jest mniejszy niż stary : tylko do usuwanych elementów i iterator zakońcowy Jeśli nowy rozmiar jest większy niż stary : wszystkie iteratory zostają unieważnione |
pop_front | Tylko do usuwanych elementów |
pop_back | Tylko do usuwanych elementów i iterator zakońcowy |
[edytuj]Notka odnośnie unieważniania
- Wstawienie elementów na któryś z końców kolejki za pomocą insert lub emplace nie unieważnia referencji.
- push_front, push_back, emplace_front ani emplace_back nie unieważniają żadnych referencji do elementów deque.
- Usuwanie elementów z któregoś z końców kolejki za pomocą erase, pop_front lub pop_back nie unieważnia referencji do pozostałych elementów.
- Wywołanie resize z rozmiarem mniejszym, niż obecny nie unieważnia żadnych referencji do elementów, które nie zostały usunięte.
- Wywołanie resize z rozmiarem większym, niż obecny nie unieważnia żadnych referencji do elementów deque.
[edytuj]Typy składowe
Typ składowy | Definicja | ||||
value_type | T | ||||
allocator_type | Allocator | ||||
size_type | Typ całkowitoliczbowy bez znaku (zwykle std::size_t) | ||||
difference_type | Typ całkowitoliczbowy ze znakiem (zwykle std::ptrdiff_t) | ||||
reference |
| ||||
const_reference |
| ||||
pointer |
| ||||
const_pointer |
| ||||
iterator | LegacyRandomAccessIterator | ||||
const_iterator | Constant RandomAccessIterator | ||||
reverse_iterator | std::reverse_iterator<iterator> | ||||
const_reverse_iterator | std::reverse_iterator<const_iterator> |
[edytuj]Metody
Konstruuje deque (publiczna metoda) | |
Niszczy deque (publiczna metoda) | |
przypisuje wartości do kontenera (publiczna metoda) | |
przypisuje wartości do kontenera (publiczna metoda) | |
zwraca skojarzony alokator (publiczna metoda) | |
Dostęp do elementów | |
dostęp do wskazanego elementu, ze sprawdzeniem zakresów (publiczna metoda) | |
dostęp do wskazanego elementu (publiczna metoda) | |
dostęp do pierwszego elementu (publiczna metoda) | |
dostęp do ostatniego elementu (publiczna metoda) | |
Iteratory | |
zwraca iterator na początek kontenera (publiczna metoda) | |
zwraca iterator za koniec kontenera (publiczna metoda) | |
zwraca odwrócony iterator na początek (publiczna metoda) | |
zwraca odwrócony iterator za koniec kontenera (publiczna metoda) | |
Pojemność | |
sprawdza, czy kontener jest pusty (publiczna metoda) | |
zwraca liczbę elementów (publiczna metoda) | |
zwraca maksymalną możliwą liczbę elementów (publiczna metoda) | |
(C++11) | zmniejsza zużycie pamięci poprzez zwolnienie nieużywanej pamięci (publiczna metoda) |
Modyfikatory | |
czyści zawartość (publiczna metoda) | |
wstawia elementy (publiczna metoda) | |
(C++11) | konstruuje element "w miejscu" (publiczna metoda) |
usuwa elementy (publiczna metoda) | |
dodaje element na koniec (publiczna metoda) | |
(C++11) | konstruuje element "w miejscu" na końcu (publiczna metoda) |
usuwa ostatni element (publiczna metoda) | |
wstawia element na początek (publiczna metoda) | |
(C++11) | konstruuje element "w miejscu" na początku (publiczna metoda) |
usuwa pierwszy element (publiczna metoda) | |
zmienia liczbę przechowywanych elementów (publiczna metoda) | |
zamienia zawartość (publiczna metoda) |
[edytuj]Funkcje operujące na zawartości
leksykograficznie porównuje wartości w deque (szablon funkcji) | |
specjalizacja dla algorytmu std::swap (szablon funkcji) |
[edytuj]Przykład
#include <iostream>#include <deque> int main(){// Tworzy deque zawierającą liczby całkowite std::deque<int> d ={7, 5, 16, 8}; // Dodaje liczby na początek i koniec kontenera d.push_front(13); d.push_back(25); // Iteruje po wartościach w deque i wypisuje jefor(int n : d){std::cout<< n <<'\n';}}
Wynik:
13 7 5 16 8 25