Kontener typu unordered_map - tablica asocjacyjna

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 5478 razy

Wstęp

Definicja klasy unordered_map mieści się w pliku nagłówkowym unordered_map i jest dostępna od standardu C++ 11 w kompilatorach ten standard obsługujących. Sama klasa różni się od opisywanej na stronie Programowanie → Podstawy C++ → Kontener typu map - tablica asocjacyjna tym, że nie wykonuje ona sortowania elementów, a kolejne elementy dodawane są na samym początku tejże tablicy asocjacyjnej dzięki czemu dodawanie elementów do obiektu klasy unordered_map jest znacznie szybsze.

Konstruktory klasy unordered_map

Standardowo klasa unordered_map udostępnia konstruktor bezparametrowy oraz konstruktor kopiujący. Pierwszy z nich tworzy obiekt klasy unordered_map nie posiadający elementów, drugi kopiuje elementy podanego jako argument obiektu tego samego typu.

std::unordered_map<std::string, int> unorderedmap; std::unordered_map<std::string, int> unorderedmap_copy(unorderedmap);

Istnieje jeszcze możliwość zainicjalizowania obiektu klasy unordered_map elementami za pomocą konstruktora w następujący sposób:

std::unordered_map<std::string, int> unorderedmap( {{"key 1", 0}, {"key 2", 1}} );

Możliwe jest również skopiowanie zakresu danych z innego obiektu tego samego typu za pomocą konstruktora:

std::unordered_map<std::string, int> unorderedmap( {{"key 1", 0}, {"key 2", 1}} ); std::unordered_map<std::string, int> unorderedmap_copy( unorderedmap.begin(), unorderedmap.end() );

Dodawanie i odwoływanie się do elementów do obiektu klasy unordered_map

Elementy do obiektu klasy unordered_map można dodawać za pośrednictwem operatora [] w następujący sposób:

std::unordered_map<std::string, int> unorderedmap; unorderedmap["key 1"] = 20; unorderedmap["key 2"] = 30;

Ten sam operator umożliwia dostęp do wartości stojącej za danym kluczem:

auto value = unorderedmap["key 1"];

Elementy można również dodawać za pomocą metody insert:

std::unordered_map<std::string, int> unorderedmap; std::unordered_map<std::string, int> unorderedmap2( {{"key 6", 10}, {"key 7", 12}} ); unorderedmap.insert( {{"key 3", 23}, {"key 4", 45}} ); unorderedmap.insert( std::make_pair<std::string,double>("key 5", 5) ); unorderedmap.insert( unorderedmap2.begin(), unorderedmap.end() );

Sprawdzanie czy klucz istnieje i znajdowanie elementu stojącego za danym kluczem

Metoda find umożliwia sprawdzenie, czy dany klucz istnieje w tablicy asocjacyjnej:

std::unordered_map<std::string, int> unorderedmap( {{"key 1", 10}, {"key 2", 20}} ); if(unorderedmap.find("key 1") != unorderedmap.end()){ std::cout << "Key: \aposkey 1\apos exist" << std::endl; }else{ std::cout << "Key: \aposkey 1\apos not exist" << std::endl; }

Iterowanie po elementach obiektu klasy unordered_map

Po elementach obiektu klasy unordered_map można iterować wykorzystując wskaźnik zawierający pola first (klucz); second (wartość). Oto przykład:

std::unordered_map<std::string, int> unorderedmap; unorderedmap["key 1"] = 1; unorderedmap["key 2"] = 2; for(std::map<std::string, int, Compare>::iterator element = unorderedmap.begin(); element != unorderedmap.end(); element ++){ std::cout << element->first << ": " << element->second << std::endl; }

W C++ 11 można iterować też w inny sposób:

std::unordered_map<std::string, int> unorderedmap( {{"key 1", 1}, {"key 2", 2}} ); for(auto& elemenent: unorderedmap) std::cout << "Key: " << element.first() << " value: " << element.end() << std::endl;

Usuwanie elementów z obiektu klasy unordered_map

Metoda erase umożliwia usunięcie jednego elementu lub zakresu elementów z tablicy. Możliwe jest to poprzez podanie wskaźnika lub wskaźników (w przypadku usuwania zakresu danych) na elementy zawarte wewnątrz tejże klasy w następujący sposób:

std::unordered_map<std::string, int> unorderedmap; unorderedmap["key 1"] = 1; unorderedmap["key 2"] = 2; unorderedmap.erase(unorderedmap.begin(), unorderedmap.end());

Możliwe jest również posłużenie się wartościami kluczy:

std::unordered_map<std::string, int> unorderedmap; unorderedmap["key 1"] = 1; unorderedmap["key 2"] = 2; unorderedmap.erase(std::string("key 1"));

Liczba elementów zawartych w obiekcie klasy unordered_map

Metoda size umożliwia uzyskanie informacji liczbie elementów zawartych w obiekcie klasy unordered_map.

Sprawdzanie, czy obiekt klasy unordered_map nie zawiera elementów

Metoda empty zwraca true, gdy obiekt klasy unordered_map nie zawiera elementów.

Strony powiązane
strony powiązane
  1. cplusplus.com/reference/unordered_map/unordered_map/ - opis klasy unordered_map [en]
Propozycje książek