Skip to content

Latest commit

 

History

History
157 lines (116 loc) · 4.55 KB

05-map.md

File metadata and controls

157 lines (116 loc) · 4.55 KB

Podstawy C++

std::map<K, V>

Coders School

Mapa, słownik

  • mapa to zbiór par (klucz - Key, wartość - Value)
  • std::map w C++ to odpowiednik dict z Pythona

Przykładowo tworzymy kolekcję ulubionych płyt i układamy je w szafce.

Oczywiście płyt tych mamy ogromną liczbę i chcielibyśmy móc łatwo odnaleźć płytę, gdy będziemy jej poszukiwać.

W tym celu numerujemy sobie wszystkie płyty i zapisujemy sobie na kartce informacje, pod jakim numerem znajduje się określony tytuł. W ten sposób tworzymy właśnie mapę.

std::map<size_t, std::string> discs {
    {1, "The Lord of the Rings: The Fellowship of the Ring"},
    {2, "The Lord of the Rings: The Two Towers"},
    {3, "The Lord of the Rings: The Return of the King"}
};

Kluczem jest tutaj numer, natomiast wartością jest tytuł filmu.


Operacje na std::map

  • początek i koniec zakresu
    • begin()
    • end()
  • informacje o liczbie elementów w mapie
    • size()
  • informacja czy mapa jest pusta
    • empty()
  • dostęp do elementu dla określonego klucza
    • operator[key]
  • dodanie parę (klucz, wartość) do mapy o ile taka para jeszcze w niej nie występuje
    • insert({key, value})

Dokumentacja na cppreference.org


Pytanie

Co się wydarzy, gdy zawołamy na wspomnianej mapie:

discs[4] = "Harry Potter";

Przypisanie czegoś do elementu mapy poprzez operator[] sprawia, że:

  • jeżeli istnieje już wartość dla danego klucza to ją podmienimy.
  • gdy nie istnieje wartość dla danego klucza, to utworzymy nową parę (klucz, wartość)

Wykonajmy ten kod

#include <iostream>
#include <map>
#include <string>

void Print(const std::map<size_t, std::string>& map) {
    for (const auto& pair : map) {
        std::cout << pair.first << " | " << pair.second << '\n';
    }
}

int main() {
    std::map<size_t, std::string> discs {
        {1, "The Lord of the Rings: The Fellowship of the Ring"},
        {2, "The Lord of the Rings: The Two Towers"},
        {3, "The Lord of the Rings: The Return of the King"}
    };

    Print(discs);
    std::cout << "\nAfter adding a new element\n";
    discs[4] = "Harry Potter";
    Print(discs);
    std::cout << "\nAfter modification of an element\n";
    discs[4] = "Harry Potter and the Philosopher's Stone";
    Print(discs);
}

Wynik

1 | The Lord of the Rings: The Fellowship of the Ring
2 | The Lord of the Rings: The Two Towers
3 | The Lord of the Rings: The Return of the King

After adding a new element
1 | The Lord of the Rings: The Fellowship of the Ring
2 | The Lord of the Rings: The Two Towers
3 | The Lord of the Rings: The Return of the King
4 | Harry Potter

After modification of an element
1 | The Lord of the Rings: The Fellowship of the Ring
2 | The Lord of the Rings: The Two Towers
3 | The Lord of the Rings: The Return of the King
4 | Harry Potter and the Philosopher's Stone

Zadanie

Napisz funkcję, która przyjmuje std::vector<int> oraz std::list<std::string> i zwraca mapę std::map<int, std::string>. Kluczami w mapie mają być elementy wektora, a wartościami elementy listy. Pobierz zadanie

#include <iostream>
#include <list>
#include <string>
#include <vector>

// Implement createMap. It should take a vector and list and
// return a map of merge them as keys from the vector and values from the list


int main() {
    std::vector<int> vec{1, 2, 3, 4, 5};
    std::list<std::string> list{"One", "Two", "Three", "Four", "Five"};
    auto map = createMap(vec, list);

    for (const auto& pair : map)
        std::cout << pair.first << " | " << pair.second << '\n';

    return 0;
}