Jak mogę zapętlić std::map
w C ++? Moja mapa jest zdefiniowana jako:
std::map< std::string, std::map<std::string, std::string> >
Na przykład powyższy kontener zawiera takie dane:
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";
Jak mogę przejść przez tę mapę i uzyskać dostęp do różnych wartości?
Odpowiedzi:
Stare pytanie, ale pozostałe odpowiedzi są nieaktualne od C ++ 11 - możesz użyć pętli opartej na pętli i po prostu zrobić:
powinno to być znacznie czystsze niż wcześniejsze wersje i pozwala uniknąć niepotrzebnych kopii.
Niektórzy opowiadają się za zastąpieniem komentarzy wyraźnymi definicjami zmiennych referencyjnych (które zostają zoptymalizowane, jeśli nie są używane):
źródło
const
późniejauto
? Czy to czysto estetyczne?int const *x
iint *const x
możesz napisać to,int const *const x
co jest o wiele jaśniejsze niż IMOconst int *const x
. Ale jest tylko analizowany od lewej do prawej, więc efekt jest taki sam. Zobacz odpowiedzi na to pytanie: stackoverflow.com/questions/5503352/const-before-or-const-afterMożesz użyć iteratora.
źródło
for(auto iterator = m.begin(); iterator != m.end(); iterator++)
lub ładniej w C ++ 0x:
źródło
W C ++ 17 (lub nowszym) możesz użyć funkcji „powiązań strukturalnych”, która pozwala zdefiniować wiele zmiennych o różnych nazwach, za pomocą pojedynczej krotki / pary. Przykład:
Pierwotny wniosek (przez luminarzy Bjarne Stroustrup, Herb Sutter i Gabriel Dos Reis) jest zabawa do odczytu (i sugerowane składnia jest bardziej intuicyjny IMHO); zaproponowano również sformułowanie standardu, którego czytanie jest nudne, ale bliższe temu, co się naprawdę wydarzy.
źródło
Zrób coś takiego:
źródło
C ++ 11:
wynik:
źródło
użyj,
std::map< std::string, std::map<std::string, std::string> >::const_iterator
gdy mapa jest stała.źródło
auto
bracie, albo ten, kto używa vima, przejdzie na KO.Jak wspomniano w swojej odpowiedzi einpoklum , od C ++ 17 można również używać strukturalnych deklaracji wiążących . Chcę to rozszerzyć, zapewniając pełne rozwiązanie do iteracji mapy w wygodny sposób:
Uwaga 1: Do wypełnienia mapy użyłem listy inicjalizującej (która jest funkcją C ++ 11 ). Czasami może to być przydatne, aby utrzymać stałe inicjalizacje kompaktowe.
Uwaga 2: Jeśli chcesz zmodyfikować mapę
m
w pętli, musisz usunąćconst
słowa kluczowe.Kod na Coliru
źródło
Pierwszym rozwiązaniem jest użycie range_based dla pętli, np .:
Uwaga: Gdy
range_expression
typem jest,std::map
torange_declaration
typem jeststd::pair
.Kod 1:
Drugie rozwiązanie:
Kod 2
źródło