QMap lub std::map

0

Chciałbym się od was dowiedzieć następujących rzeczy

  1. Do czego przydaje się QMap lub std::map ?
  2. W jakich przypadkach należy używać map ?
0

Programistą C++ nie jestem, ale mapa (słownik) to tablica (wektor) gdzie klucze mogą być dowolnego typu. Czyli zawsze jak chcesz mieć kolekcje zawierającą klucz wartość bo np mockujesz sobie bazę danych (UserId -> User) lub robisz innego cache

1

Możesz rozumieć jako wzbogaconą tablicę, gdzie indeksem nie muszą być kolejne liczby całkowite, a "coniebądź"

0

@KamilAdam - Tobie chodzi o to, że chciałbym wybrać sobie te dane z bazy, zmagazynować je w mapie aby mieć do nich szybki dostęp - np zapamiętać kilku najczęściej logowanych userów i na tej podstawie szybko ich zalogować bez odpytywania bazy ?

tzn ja już z grubsza wiem jak map używać. Ale nie wiem w czym to zastosować, bo tych pojemników się porobiło nie wiem po co ? Z chłopaki piszą je z nudów ? I w sumie nie wiem do czego z map skorzystać, przydałby się praktyczny problem i zastosowanie ich w tym problemie.

0

std::map oraz std::unordered_map to implementacje hash mapy w STLu, dla typowych zastosowań powinno się wykorzystywać drugi wariant chyba.

Z chłopaki piszą je z nudów ?

QMap został napisany po to, by lepiej pasował do reszty modułów biblioteki Qt, najwidoczniej std::map nie rozwiązywał problemów, które potrzebowali rozwiązać.

1
zkubinski napisał(a):

@KamilAdam - Tobie chodzi o to, że chciałbym wybrać sobie te dane z bazy, zmagazynować je w mapie aby mieć do nich szybki dostęp - np zapamiętać kilku najczęściej logowanych userów i na tej podstawie szybko ich zalogować bez odpytywania bazy ?

tzn ja już z grubsza wiem jak map używać. Ale nie wiem w czym to zastosować, bo tych pojemników się porobiło nie wiem po co ? Z chłopaki piszą je z nudów ? I w sumie nie wiem do czego z map skorzystać, przydałby się praktyczny problem i zastosowanie ich w tym problemie.

Na pewno nie z nudów. Bardzo użyteczne. Powiedziałbym po liście moja druga najczęstsza struktura.
Kodu na to jest multum, musiałeś się bardzo mało poruszać w świecie C++, jeśli nie widziałeś

0

@AnyKtokolwiek Kodu na to jest multum, musiałeś się mało poruszać, jeśli nie widziałeś

widziałem, w Qt chociażby taki przykład

Kraj;Ludność;Powierzchnia
Polska;4mld;45000mln km^2

i nie wiem jak to ugryźć, tzn jak to skojarzyć ze sobą ? Czy JEDEN klucz np Kraj może mieć WIELE RÓŻNYCH wartości ?

0

przydałby się praktyczny problem i zastosowanie ich w tym problemie.

Generujesz plik na podstawie innego pliku i musisz wybrać rozszerzenie na podstawie rozszerzenia bazowego pliku.

3

Nie zgodzę się z kolegami. Wektor, czy tablica są ciągłymi przestrzeniami w pamięci, przez co nie należy kojarzyć z nimi mapy. Co to oznacza? Jeśli masz wektor i mapę

std::vector <std::string> MyVector;
std::map <int, std::string> MyMap; 

Jeśli istnieje element wektora myVect[2] to oznacza, że musi istnieć również, myVect[0] i myVect[1]. Jeśli masz element mapy myMap[3] może być jedynym elementem kontenera lub następnym może być myMap[9999].

Związana jest z tym, oczywiście różnica w czasie dostępu i dodawaniu elementów, ale jeśli nie operujesz na dużych kontenerach, to teraz nie zaprzątaj sobie tym głowy.

Kiedy używamy? Poza tym co powiedzieli koledzy warto wspomnieć od dwóch właściwościach mapy. Wyobraź sobie, że musisz zrobić bazę pracowników posortowaną w kolejności alfabetycznej.

std::map <std::string, employee> empMap;

empMap["Kowalski"] = //jakaś wartość employee
empMap["Arcichowski"] = //jakaś wartość employee

for (auto& [key, value]: empMap) {
    std::cout << key << " has value " << value << std::endl;
}

Dodanie elementu empMap["Arcichowski"] spowoduje automatyczne umieszczenie go przed empMap["Kowalski"], bez używania algorytmu sortującego. Klucz może być dowolnego typu i możesz implementować własny algorytm sortowania ale to już wdawanie się w szczegóły. Drugą właściwością, jest to że odwołanie się do nieistniejącego elementu w sposób "map[key] = value" spowoduje stworzenie tego elementu a nie wyjątek.

2

std::map jest implementowana jako drzewo czerowono-czarne, więc przechowuje elementy posortowane wg klucza, std::unordered_map przechowuje elementy nieposortowane ale jest implementowane jako tablica hashująca. Więc, jeżeli potrzebujesz żeby elementy były przechowywane w jakimś porządku, bo potrzebujesz np. je wg tego porządku wypisać to std::map jest przydatna, jeżeli potrzebujesz częstych "random access" do elementu o określonym kluczu to wtedy std::unordered_map lepiej pasuje.

3

Ojejku panowie, czasem są momenty, że mi brak łapek w dół na 4p.

QMap i std::map to kontenery o drzewiastej strukturze (żadne hashmapy!) oferujące dostęp do par klucz-wartość posortowanych po kluczu. QMap i reszta kontenerów Qt powstały rzeczywiście ponieważ "kontenery std:: nie spełniały wymagań Qt" - bo nie istniały. Qt jest przecież o kilka lat starsze od pierwszego standardu C++.

Jeśli nie potrzebujesz sortowania danych to użyj hashmapy - np. std::unordered_map albo QHash.

Jeśli zastanawiasz się nad wyborem kontener Qt vs std: z reguły wybieraj std, chyba, że będziesz miał interakcję z kodem Qt (w szczególności jeśli jakieś API np. wymaga QList, to nie używaj std::vector). Tutaj patrz komentarze: QVariant dobrze współgra z z QTypami, z std już mniej. Jeśli jakiś kontener Qt nie ma odpowiednika w stdlibie, to go użyj. Kontenery Qt starają się mieć api zgodne z stdlibem, ale w kilku miejscach są zaskakujące.

1 użytkowników online, w tym zalogowanych: 0, gości: 1