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.
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.
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ż.
map::count
jest zaimplementowany jako find(__x) == end() ? 0 : 1;
. Na multimap
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, a count(k)
podejście zdecydowanie nie ma równości semantycznej z has(k)
. W tym przypadku też nie jest find(k)
. Sprawdź liczbę wyświetleń tego pytania.
Odpowiedź Potatoswatter jest w porządku, ale wolę użyć find
lub lower_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.
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
}
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 a multimap
, lower_bound
metoda wstawia na początku równoważnego zakresu, podczas gdy zwykła insert
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 .