Próbuję sprawdzić, czy dany klucz znajduje się na mapie i jakoś nie mogę tego zrobić:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
więc jak mogę wydrukować zawartość p?
c++
dictionary
stl
Nic nie możemy zrobić
źródło
źródło
std::pair<iterator,bool> insert( const value_type& value );
Jaki bool zwraca? informuje, czy klucz jest już obecny, czy nie?Odpowiedzi:
Posługiwać się
map::find
źródło
map::count
count
zwracaint
chwilę, afind
zwraca cały iterator. Zapisujesz budowę iteratora :) Oczywiście, jeśli później zamierzasz użyć wartości, jeśli istnieje, użyj funkcji znajdź i zapisz jej wynik.count
ifind
są prawie identyczni w prędkości, gdy korzystają z map, które wymagają unikalnych kluczy. (1) Jeśli nie potrzebujesz elementów do utrzymania określonej kolejności, użyj std :: unordered_map , który ma prawie stałe wyszukiwania i może być bardzo korzystny, gdy przechowujesz więcej niż kilka par. (2) Jeśli chcesz użyć tej wartości, jeśli istnieje, zapisz wynik :: find i użyj iteratora, aby zapobiec 2 wyszukiwaniom:auto it = m.find("f"); if (it != m.end()) {/*Use it->second*/}
Aby sprawdzić, czy istnieje konkretny klucz na mapie, użyj
count
funkcji członka na jeden z następujących sposobów:Dokumentacja dla
map::find
mówi: „Inną funkcją członka,map::count
mogą być stosowane po prostu sprawdzić, czy dany klucz istnieje.”Dokumentacja dla
map::count
mówi: „Ponieważ wszystkie elementy w pojemniku mapy są unikalne, funkcja może zwrócić tylko 1 (jeśli element zostanie znaleziony) lub zero (inaczej).”Aby pobrać wartość z mapy za pomocą klucza, o którym wiesz, że istnieje, użyj map :: at :
W przeciwieństwie do map :: operator [] ,
map::at
nie utworzy nowego klucza na mapie, jeśli określony klucz nie istnieje.źródło
find
zamiast tego.second
Atrybut zwrócony przez iteracyjnejfind
można stosować pobrać wartość klucza. Jeśli używaszcount
wtedyat
luboperator[]
wykonujesz dwie operacje, kiedy mógłbyś użyć tylko jednej.if(m.count(key))
int
nabool
. Chociaż istnieją inne kompilatory C ++, które nie wydają podobnego ostrzeżenia, wolę używać jawnego porównania, aby wyjaśnić intencję i zwiększyć czytelność. Zauważ, że inne języki, takie jak C #, zabraniają takiej niejawnej konwersji, aby zapobiec możliwości wprowadzenia subtelnych błędów programowania.C ++ 20 pozwala nam
std::map::contains
to zrobić.źródło
Możesz użyć
.find()
:źródło
Jeśli chcesz użyć innego interfejsu API, znajdź idź do
m.count(c)>0
źródło
Myślę, że chcesz
map::find
. Jeślim.find("f")
jest równym.end()
, to klucz nie został znaleziony. W przeciwnym razie funkcja find zwraca iterator wskazujący na znaleziony element.Błąd wynika z tego, że
p.first
jest iteratorem, który nie działa przy wstawianiu strumienia. Zmień ostatnią linię nacout << (p.first)->first;
.p
jest parą iteratorów,p.first
jest iteratorem,p.first->first
jest ciągiem kluczy.Mapa może mieć tylko jeden element dla danego klucza, więc
equal_range
nie jest zbyt przydatna. Jest zdefiniowany dla mapy, ponieważ jest zdefiniowany dla wszystkich kontenerów asocjacyjnych, ale jest o wiele bardziej interesujący dla wielu map.źródło
C++17
uprościłem to trochę bardziej dziękiIf statement with initializer
. W ten sposób możesz mieć swoje ciasto i zjeść je.źródło
sprawdź, czy klucz istnieje, czy nie, i zwraca liczbę wystąpień (0/1 na mapie):
sprawdź, czy klucz istnieje, czy nie, i zwróć iterator:
w twoim pytaniu błąd spowodowany złym
operator<<
przeciążeniem, ponieważp.first
jest tomap<string, string>
, że nie można go wydrukować. Spróbuj tego:źródło
cout
może oznaczać coś zupełnie innego niżcount
Oczywiście, jeśli chcesz uzyskać bardziej wyszukany efekt, zawsze możesz utworzyć szablon funkcji, która również przyjęła funkcję znalezioną i funkcję nieodnalezioną, coś w stylu:
I użyj tego w ten sposób:
Minusem tego jest dobre imię, „find_and_execute” jest niezręczny i nie mogę wymyślić nic lepszego od głowy…
źródło
Zachowaj ostrożność przy porównywaniu wyniku wyszukiwania z końcem, jak dla mapy „m”, ponieważ wszystkie odpowiedzi zrobiono powyżej map :: iterator i = m.find („f”);
nie powinieneś próbować wykonywać żadnych operacji, takich jak drukowanie klucza lub wartości za pomocą iteratora i, jeśli jest ona równa m.end (), w przeciwnym razie doprowadzi to do błędu segmentacji.
źródło
Porównując kod std :: map :: find i std :: map :: count, powiedziałbym, że pierwszy może przynieść pewną przewagę wydajnościową:
źródło
Wiem, że to pytanie ma już kilka dobrych odpowiedzi, ale myślę, że moje rozwiązanie warte jest podzielenia się.
Działa zarówno
std::map
istd::vector<std::pair<T, U>>
jest dostępny z C ++ 11.źródło
Jeśli chcesz porównać parę map, możesz użyć tej metody:
To przydatna technika.
źródło
źródło