Jedynym sposobem znalazłem sprawdzić duplikatów jest przez włożenie i sprawdzenie std::pair.secondza 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.secondza 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::countjest zaimplementowany jako find(__x) == end() ? 0 : 1;. Na multimapmajowym 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ć findlub lower_boundzamiast tego. lower_boundjest 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
}
valuemoże zostać pominięte, jeśli wstawianie jest niepotrzebne.
lower_boundrozwią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. :-)
inserta priori. W rzeczywistości istnieje inna różnica, jeśli używasz a multimap, lower_boundmetoda wstawia na początku równoważnego zakresu, podczas gdy zwykła insertmetoda 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 .