Jedynym sposobem znalazłem sprawdzić duplikatów jest przez włożenie i sprawdzenie std::pair.second
za false
, ale problemem jest to, że nadal wstawia coś, jeśli klucz jest nieużywany, natomiast to, co chcę jest map.contains(key);
funkcja.
148
Odpowiedzi:
Użyj
my_map.count( key )
; może zwrócić tylko 0 lub 1, co jest w istocie wynikiem logicznym, którego chcesz.Alternatywnie
my_map.find( key ) != my_map.end()
działa też.źródło
map::count
jest zaimplementowany jakofind(__x) == end() ? 0 : 1;
. Namultimap
majowym masz argumentu wydajności, ale to nie jest kwestia OP i nadal preferują elegancję.has(k)
/contains(k)
jak każdą inną rozsądną klasę mapy na planecie. Słaby projekt interfejsu. Podejście find () jest zbyt rozwlekłe, acount(k)
podejście zdecydowanie nie ma równości semantycznej zhas(k)
. W tym przypadku też nie jestfind(k)
. Sprawdź liczbę wyświetleń tego pytania.Odpowiedź Potatoswatter jest w porządku, ale wolę użyć
find
lublower_bound
zamiast tego.lower_bound
jest szczególnie przydatne, ponieważ zwrócony iterator może być później użyty do wstawienia z podpowiedzią, jeśli chcesz wstawić coś z tym samym kluczem.źródło
value
może zostać pominięte, jeśli wstawianie jest niepotrzebne.lower_bound
rozwiązanie oparte na a jest przesadą. W pewnym sensie właśnie wspomniałem o mojej odpowiedzi „dla kompletności”; jak powiedziałem, twój jest całkowicie wystarczający. :-)insert
a priori. W rzeczywistości istnieje inna różnica, jeśli używasz amultimap
,lower_bound
metoda wstawia na początku równoważnego zakresu, podczas gdy zwykłainsert
metoda dodaje do końca zakresu.Twoje dezyderatum,,
map.contains(key)
jest zaplanowane na projekt standardu C ++ 2a . W 2017 roku został zaimplementowany przez gcc 9.2 . Jest również w obecnym brzęku .źródło