Jedyny sposób, w jaki znalazłem, aby sprawdzić duplikaty, to wstawianie i sprawdzanie std::pair.second
dla false
, ale problem polega na tym, że nadal wstawia coś, jeśli klucz nie jest używany, podczas gdy ja chcę mieć funkcję map.contains(key);
.Jak sprawdzić, czy std :: map zawiera klucz bez wstawiania?
Odpowiedz
Użyj my_map.count(key)
; może tylko zwrócić 0 lub 1, co jest w zasadzie pożądanym wynikiem boolowskim.
Alternatywnie działa również my_map.find(key) != my_map.end()
.
-1: Powinien używać 'find'. Jest co najmniej tak samo skuteczny, jak "count" dla map i multimaps, i jest bardziej wydajny, gdy bierze się pod uwagę typową potrzebę wprowadzenia zmian w odnalezionych kluczach. –
@John: To cuchnie przedwczesnej optymalizacji. W GCC (i jestem pewien, że najbardziej rozsądne systemy) 'map :: count' jest zaimplementowane jako' find (__ x) == end()? 0: 1; '. Dla 'multimap' możesz mieć argument wydajności, ale to nie jest pytanie OP i wciąż wolę elegancję. – Potatoswatter
Nie, przedwczesny argument optymalizacji jest ważny tylko wtedy, gdy optymalizacja wymaga pewnego wysiłku, który w tym przypadku nie jest. – markh44
Odpowiedź Potatoswatter jest w porządku, ale wolę używać zamiast tego find
lub lower_bound
. lower_bound
jest szczególnie przydatny, ponieważ powrócony iterator może następnie zostać użyty do wskazanego wstawienia, jeśli chcesz wstawić coś z tym samym kluczem.
map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) { // not found
// ...
my_map.insert(iter, make_pair(key, value)); // hinted insertion
} else {
// ... use iter->second here
}
To jest nieco inne niż on mówi, że on to robi ... jedyna różnica polega na tym, że obliczanie wartości "value" może zostać pominięte, jeśli wstawienie nie jest konieczne. – Potatoswatter
Jasne, rozumiem, że OP nie chce wstawić, więc rozwiązanie oparte na "low_bound" jest przesadzone. Właśnie wspomniałem o mojej odpowiedzi "na kompletność"; tak jak powiedziałem, twój jest całkowicie odpowiedni. :-) –
Tak, to jest dobra odpowiedź i nie zgadzam się z niczym. Wystarczy wskazać związek z alternatywą "wstaw" a priori. W rzeczywistości jest inna różnica, jeśli za pomocą 'multimap', metoda' lower_bound' wstawia na początku równoważnego zakresu, podczas gdy zwykła metoda 'insert' dodaje do końca zakresu. – Potatoswatter
- 1. jak łatwo sprawdzić, czy std :: map i std :: unordered_map zawiera te same elementy
- 2. Jak sprawdzić, czy klucz istnieje w swiftyJSON, gdy json zawiera tablicę bez kluczy
- 3. sprawdź, czy std :: vector zawiera określony obiekt?
- 4. C++ Jak znaleźć największy klucz w std :: map?
- 5. Jak sprawdzić, czy MKCoordinateRegion zawiera CLLocationCoordinate2D bez używania MKMapView?
- 6. Czy można bezpiecznie używać weak_ptr w std :: set lub klucz std :: map
- 7. jak się dowiedzieć z Option [Map [String, Seq [String]]] zawiera klucz czy nie?
- 8. Jak sprawdzić, czy tekst zawiera tylko liczby?
- 9. Jak sprawdzić, czy moja tablica zawiera obiekt?
- 10. Jak mogę sprawdzić, czy zmienna zawiera lambdę?
- 11. Jak sprawdzić, czy zmienna VARCHAR zawiera podłańcuch?
- 12. Jak sprawdzić, czy bitmask zawiera bit?
- 13. Jak sprawdzić, czy słownik zawiera określone klucze?
- 14. Jak sprawdzić, czy obiekt zawiera tablicę bajtów?
- 15. jak sprawdzić, czy lista zawiera podmenu
- 16. Jak działa iterator std :: map?
- 17. C++ std Kopiowanie listę map
- 18. Jak przekonwertować posortowane std :: lista std :: pair na std :: map
- 19. Jak sprawdzić, czy istnieje klucz aplikacji?
- 20. Jak sprawdzić, czy istnieje klucz rejestru
- 21. std :: map z std :: weak_ptr key
- 22. NSDictionary - Należy sprawdzić, czy słownik zawiera parę klucz-wartość, czy też nie.
- 23. Dlaczego mogę używać const char * jako klucz w std :: map <std :: string, int>
- 24. Sprawdź, czy tablica zawiera tylko jeden klucz/wartość
- 25. Czy istnieje różnica między std :: map <int, int> a std :: map <const int, int>?
- 26. C++ sprawdzić czy konstruktor zawiera parametr danego typu
- 27. Czy bezpiecznie jest uzyskać obiekt w std :: map przez odniesienie?
- 28. Aby sprawdzić, czy ciąg zawiera określone słowo
- 29. Używanie char * jako klucza w std :: map, jak to działa
- 30. sprawdzić, czy ciąg zawiera numer większy niż
możliwe duplikat [Jak się dowiedzieć, czy dany klucz istnieje w C++ std :: map] (http://stackoverflow.com/questions/1939953/how-to-find-if-a-given -key-exists-in-ac-stdmap) – OrangeDog