Adaptory kontenerów

Adaptory kontenerów
szablony klas używające kontenerów do przechowywania elementów oraz udostępniające ograniczony interfejs.

Informacja

Adaptory nie posiadają iteratorów. Nie można ich stosować w standardowych algorytmach.

stack<T>

  • stos
  • pozwala jedynie na dodawanie i usuwanie elementów na jego końcu (LIFO)
  • <stack>

queue<T>

  • kolejka FIFO
  • <queue>

priority_queue<T>

  • kolejka priorytetowa układa elementy w takiej kolejności, że pierwszy jest zawsze element o największej wartości
  • możliwe jest dodanie elementu do kolejki a także sprawdzenie i usunięcie pierwszego elementu
  • <queue>

std::stack

Stos jest kontenerem sekwencyjnym pozwalającym na dodawanie i usuwanie elementów tylko z jednego końca (LIFO).

Szablon klasy std::stack jest adaptorem dowolnego kontenera sekwencyjnego (deque, vector, list) udostępniającego składowe back, push_back i pop_back. Domyślnie stosowany jest kontener std::deque.

Interfejs stosu:

bool stack::empty() const

zwraca true jeśli stos jest pusty

void stack::pop()

usuwa element ze szczytu stosu

void stack::push(const value_type &x)

wstawia element x na szczyt stosu

size_type stack::size() const

zwraca liczbę elementów na stosie

value_type &stack::top()

zwraca element ze szczytu stosu

std::queue

Kolejka jest kontenerem sekwencyjnym, pozwalającym na dodawanie elementów na jednym końcu i usuwanie ich na drugim (FIFO)

Szablon klasy std::queue<T, Container> jest adaptorem dowolnego kontenera sekwencyjnego udostępniającego metody: front, back, push_back i pop_front. Domyślnie stosowany jest kontener std::deque.

Interfejs kolejki:

bool queue::empty() const

zwraca true jeśli kolejka jest pusta

void queue::pop()

usuwa pierwszy element z kolejki

value_type &queue::front()

zwraca pierwszy element kolejki

value_type &queue::back()

zwraca ostatni, czyli ostatnio dodany element kolejki

void queue::push(const value_type &x)

na koniec kolejki wstawia element x

size_type queue::size() const

zwraca liczbę elementów znajdujących się w kolejce

std::bitset

std::bitset
efektywny zbiór bitowy o stałej wielkości.

Różnice w stosunku do vector<bool>

  • nie zawiera iteratorów
  • rozmiar musi być znany w trakcie kompilacji
bitset<16> small_set(string("1011011011"));  // konstruktor - 16 bitów

small_set.flip();  // odwrócenie wszystkich bitów
small_set.flip(8);  // odwrócenie 8-go bitu

cout << small_set << endl; // wypisanie na ekranie

if (bset_one.test(4))
    cout << "bit na pozycji 4 jest ustawiony" << endl;
else
    cout << "bit na pozycji 4 nie jest ustawiony" << endl;

std::bitset - metody

bool any() const

zwraca true, jeżeli jakikolwiek bit jest ustawiony na 1

size_t count() const

zwraca ilość bitów ustawionych na 1

bitset<N> &flip()

odwraca wartość wszystkich bitów

bitset<N> &flip(size_t n)

odwraca wartość n-tego bitu

bool none() const

zwraca true, gdy wszystkie bity są zerami

bitset<N> &reset()

zeruje wszystkie bity

bool test(size_t n) const

testuje wartość n-tego bitu

string to_string() const

zwraca ciąg znaków reprezentujących bity np. „10000101”

long to_ulong() const

przetwarza zawartość obiektu bitset na wartość całkowitą

std:bitset - operacje bitowe

Na obiektach bitset<N> możliwe jest wykonywanie operacji bitowych.

Zdefiniowane są odpowiednie operatory: &, |, >>, <<, ~, ^

// operacje bitowe
std::bitset<8> one;
std::bitset<8> two;

one[2] = 1;
two[5] = 1;

bitset<8> three = ~( one>>1 | two );
std::cout << three << " : " << three.to_ulong() << '\n'; // 11011101 : 221