Kontener typu unordered_set - zbiór niesortowany

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

Wstęp

Klasa unordered_set jest dostępna od standardu C++ 11 po załączeniu pliku nagłówkowego unordered_set. Klasa ta różni się od klasy set tym, że elementy nie są dodawane z jednoczesnym sortowaniem dzięki czemu czas dodawanie kolejnych elementów jest krótszy.

Konstruktory klasy unordered_sort

Klasa unordered_sort jak każdy kontener posiada konstruktor bezparametrowy i konstruktor kopiujący:

Listing 1
  1. std::unordered_set<int> set;
  2. std::unordered_set<int> setCopy(set);

Możliwe jest również wypełnienie obiektu klasy unordered_set elementami już na etapie konstruktora w następujący sposób:

Listing 2
  1. std::unordered_set<int> set( { 10, 20, 20, 30, 30, 40 } );

Możliwe jest też skopiowanie wartości z tablicy:

Listing 3
  1. int table[] = { 10, 20, 20, 30, 30, 40 };
  2. std::unordered_set<int> set( table, table + sizeof(table) / sizeof(int));

lub innego obiektu klasy unordered_set:

Listing 4
  1. std::unordered_set<int> set( { 10, 20, 20, 30, 30, 40 } );
  2. std::unordered_set<int> set2(set.begin(), set.end());

Iterowanie po elementach obiektu klasy unordered_set

Iterowanie po elementach w C++ 11 wygląda następująco:

Listing 5
  1. std::unordered_set<int> set( { 10, 20, 20, 30, 30, 40 } );
  2. for(auto& element: set) std::cout << element << std::endl;

Dodawanie i usuwanie elementów klasy unordered_set

Dodawanie kolejnych elementów można wykonywać za pomocą metody insert:

Listing 6
  1. std::unordered_set<int> unordered_set({0, 100, 20, 20, 30, 40});
  2. unordered_set.insert(10);
  3. sunordered_setet.insert(table, table + sizeof(table) / sizeof(int));
  4. for(auto& element: unordered_set){
  5. std::cout << element << std::endl;
  6. }

natomiast do usunięcia elementu z obiektu klasy set konieczne jest metody erase:

Listing 7
  1. std::unordered_set<int> unordered_set({0, 100, 20, 25, 30, 40});
  2. set.erase(100); // usunie element zawierający wartość 100
  3. set.erase(set.begin()); // usunie pierwszy element
  4. set.erase(set.find(25), set.end()); // usunie elementy większe lub równe 25
  5. for(auto& element: unordered_set){
  6. std::cout << *i << std::endl;
  7. }

Wynik działania powyższego kodu:

20

Możliwe jest również usunięcie wszystkich elementów obiektu klasy set za pomocą metody clear.

Zamiana elementów dwóch obiektów klasy unordered_set

Za pomocą metody swap elementy dwóch obiektów klasy unordered_set mogą zostać zamienione miejscami. Oto przykład:

Listing 8
  1. std::unordered_set<int> unorderedset( {0, 100, 20, 20, 30, 40} );
  2. std::unordered_set<int> unorderedset2(table, table + 3);
  3. std::cout << "object unordered_set before swap operation:" << std::endl;
  4. for(auto& element: unordered_set){
  5. std::cout << element << std::endl;
  6. }
  7. std::cout << "object unordered_set2 before swap operation:" << std::endl;
  8. for(auto& element: unordered_set2){
  9. std::cout << element << std::endl;
  10. }
  11. unordered_set.swap(unordered_set2);
  12. std::cout << "object unordered_set after swap operation:" << std::endl;
  13. for(auto& element: unordered_set){
  14. std::cout << element << std::endl;
  15. }
  16. std::cout << "object unordered_set2 after swap operation:" << std::endl;
  17. for(auto& element: unordered_set2){
  18. std::cout << element << std::endl;
  19. }

Wynik działania powyższego kodu:

object unordered_set before swap operation:
0
20
30
40
100
object unordered_set2 before swap operation:
0
20
100
object unordered_set after swap operation:
0
20
100
object unordered_set2 after swap operation:
0
20
30
40
100

Znajdowanie wskaźnika na element zawarty w obiekcie klasy unordered_set oraz sprawdzanie, czy element istnieje

Za pomocą metody find można uzyskać wskaźnik na szukany element w obiekcie klasy unordered_set. Metoda ta zwraca wskaźnik na koniec gdy element nie zostanie odnaleziony. W celu sprawdzenia, czy element istnieje można posłużyć się również metodą count, która zwraca 1, gdy element istnieje a 0 w przeciwnym przypadku.

Liczba elementów zawartych w obiekcie klasy unordered_set oraz sprawdzanie, czy obiekt nie ma elementów

Liczebność elementów obiektu klasy unordered_set można uzyskać za pomocą metody size, natomiast metodą empty można uzyskać informację o tym, czy obiekt nie zawiera żadnych elementów.

Strony powiązane
strony powiązane
  1. cplusplus.com/reference/unordered_set/unordered_set/ - opis klasy unordered_set [en]

Komentarze