QMap lub std::map

QMap lub std::map
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:4 miesiące
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 ?

bla
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:10 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
1

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


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:4 miesiące
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.


bla
edytowany 1x, ostatnio: zkubinski
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 8 godzin
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ć.


edytowany 1x, ostatnio: several
OG
std::map jest implementowane jako drzewo black-red, natomiast unordered_map to jest odpowiednik hashmapy z Javy/C#.
several
Yup. Skrót myślowy.
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
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ś


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:4 miesiące
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

Kopiuj
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 ?


bla
edytowany 2x, ostatnio: zkubinski
Zobacz pozostałe 5 komentarzy
PA
https://en.cppreference.com/w/cpp/container/multimap - coś w stylu map, tylko że klucze nie muszą być unikalne. Do tego to chyba jakieś drzewko więc masz złożoności logarytmiczne.
ZK
@AnyKtokolwiek - bosch, nie rozumiem jak można mieć takie głębokie luki w jednym a zarazem jakąś "wprawność" w pisaniu kodu niektórych rodzajów - bo nie miałem potrzeby korzystania z map, aż do teraz bo mi to potrzebne w zrozumieniu jednego z problemów
PA
w sumie to czemu chcesz mieć wiele wartości pod tym samym kluczem? Kluczem w twoim przypadku pewnie będzie Kraj i raczej jest on unikalny
PA
coś w stylu {"Polska": {ludnosc=4mld, powierzchnia=45000mln}, "UK": {ludnosc=7mld, powierzchnia=77000mln} ...}
AK
@part dobrze mówisz. Nie chce kolegi nękać, czy czuje struktury, czy nie
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 8 godzin
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.


BI
  • Rejestracja:ponad 9 lat
  • Ostatnio:około rok
  • Postów:47
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ę

Kopiuj
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.

Kopiuj
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.

edytowany 2x, ostatnio: bilborrd
AK
Nie masz się co nie-zgadzać, pisałem - w innych słowach - o nieciągłości integerów
BI
Rozumiem, tylko wolałem wyjaśnić, żeby kolega na rozmowie nie walnął, że "mapa to taki wektor tylko..." :)
OG
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • Postów:71
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.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:6 dni
  • Lokalizacja:Szczecin
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.


edytowany 1x, ostatnio: kq
ZK
mam rozumieć, że wbudowane kontenery Qt są złe ?
kq
Nie są złe.
ZK
to dlaczego jeżeli piszę w Qt to proponujesz wybierać kontenery z std ?
AK
Tylko nie są standardowe
kq
Łatwiej to czytać innym programistom, łatwiej szukać pomocy. Kontenery Qt to kawał dobrej roboty na swoje czasy, ale na chwilę obecną są zbędne, poza miejscami gdzie są zaszyte w API lub oferują funkcjonalności ponad te standardowe.
MarekR22
kontenery Qt bardziej lubia się z QVariant i działają z nim "out of the box", a kontenery z STL wymagają rejestracji typu. Dlatego w kodzie Qt preferowałbym kontenery Qt.
several
Zaraz tam Ojejku panowie, to ja źle napisałem a nie żadni panowie.
kq
KamilAdam też nie błysnął z analogią ;​) @MarekR22 good point, poprawię posta.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.