2010-10-07 15 views
107

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?

+3

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

Odpowiedz

231

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().

+5

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

+29

@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

+24

Nie, przedwczesny argument optymalizacji jest ważny tylko wtedy, gdy optymalizacja wymaga pewnego wysiłku, który w tym przypadku nie jest. – markh44

39

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 
} 
+0

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

+0

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. :-) –

+3

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

Powiązane problemy