Kontener typu unordered_map - tablica asocjacyjna

Stronę tą wyświetlono już: 26 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.

Listing 1
  1. std::unordered_map<std::string, int> unorderedmap;
  2. 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:

Listing 2
  1. 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:

Listing 3
  1. std::unordered_map<std::string, int> unorderedmap( {{"key 1", 0}, {"key 2", 1}} );
  2. 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:

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

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

Listing 5
  1. auto value = unorderedmap["key 1"];

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

Listing 6
  1. std::unordered_map<std::string, int> unorderedmap;
  2. std::unordered_map<std::string, int> unorderedmap2( {{"key 6", 10}, {"key 7", 12}} );
  3. unorderedmap.insert( {{"key 3", 23}, {"key 4", 45}} );
  4. unorderedmap.insert( std::make_pair<std::string,double>("key 5", 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:

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

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:

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

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

Listing 9
  1. std::unordered_map<std::string, int> unorderedmap( {{"key 1", 1}, {"key 2", 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:

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

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

Listing 11
  1. std::unordered_map<std::string, int> unorderedmap;
  2. unorderedmap["key 1"] = 1;
  3. unorderedmap["key 2"] = 2;
  4. 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]

Komentarze