A única maneira que eu encontrei para verificar se há duplicatas é através da inserção e verificando a std::pair.second
para false
, mas o problema é que isso ainda insere algo se a chave não é utilizada, enquanto que o que eu quero é uma map.contains(key);
função.
148
Respostas:
Use
my_map.count( key )
; ele pode retornar apenas 0 ou 1, que é essencialmente o resultado booleano que você deseja.Como alternativa
my_map.find( key ) != my_map.end()
também funciona.fonte
map::count
é implementado comofind(__x) == end() ? 0 : 1;
. Paramultimap
você, pode ter um argumento de desempenho, mas essa não é a pergunta da OP e ainda prefiro elegância.has(k)
/contains(k)
como todas as outras classes de mapas sãos do planeta. Design de interface ruim. A abordagem find () é muito detalhada ecount(k)
definitivamente não está em paridade semântica comhas(k)
. Para esse assunto também não éfind(k)
. Confira a contagem de visualizações desta pergunta.A resposta de Potatoswatter está bem, mas prefiro usar
find
oulower_bound
não.lower_bound
é especialmente útil porque o iterador retornado pode ser usado posteriormente para uma inserção sugerida, caso você deseje inserir algo com a mesma chave.fonte
value
pode ser ignorado se a inserção for desnecessária.lower_bound
solução baseada em excesso é um exagero. Eu meio que acabei de mencionar minha resposta "por completude"; como eu disse, o seu é perfeitamente adequado. :-)insert
a priori. Na verdade, há outra diferença se, usando amultimap
, olower_bound
método é inserido no início do intervalo equivalente, enquanto oinsert
método simples é adicionado ao final do intervalo.Seu desiderato
map.contains(key)
está agendado para o rascunho do padrão C ++ 2a . Em 2017, foi implementado pelo gcc 9.2 . Também está no clang atual .fonte