Estou tentando verificar se uma determinada chave está em um mapa e de alguma forma não consigo:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
então, como posso imprimir o que está em p?
c++
dictionary
stl
Não há nada que possamos fazer
fonte
fonte
std::pair<iterator,bool> insert( const value_type& value );
Qual é o bool que ele retorna? diz, se a chave já está presente ou não?Respostas:
Usar
map::find
fonte
map::count
count
retorna umint
tempo efind
retorna um iterador inteiro. Você salva a construção do iterador :) Obviamente, se posteriormente você usar o valor, se existir, use find e armazene o resultado.count
efind
são quase idênticos em velocidade ao usar mapas que exigem chaves únicas. (1) Se você não precisar dos elementos para manter uma ordem específica, use std :: unordered_map , que possui pesquisas quase constantes e pode ser muito benéfico ao armazenar mais do que alguns pares. (2) Se você desejar usar o valor, se existir, armazene o resultado de :: find e use o iterador para evitar 2 consultas:auto it = m.find("f"); if (it != m.end()) {/*Use it->second*/}
Para verificar se existe uma chave específica no mapa, use a
count
função de membro de uma das seguintes maneiras:A documentação para
map::find
diz: "Outra função de membro,,map::count
pode ser usada apenas para verificar se existe uma chave específica".A documentação para
map::count
diz: "Como todos os elementos em um contêiner de mapa são exclusivos, a função pode retornar apenas 1 (se o elemento for encontrado) ou zero (caso contrário)."Para recuperar um valor do mapa por meio de uma chave que você sabe existir, use map :: at :
Ao contrário de map :: operator [] ,
map::at
não criará uma nova chave no mapa se a chave especificada não existir.fonte
find
vez disso. Osecond
atributo do iterador retornado porfind
pode ser usado para recuperar o valor da chave. Se você usarcount
entãoat
ouoperator[]
estiver executando duas operações quando poderia ter usado apenas uma.if(m.count(key))
int
parabool
. Embora existam outros compiladores C ++ que não emitem um aviso semelhante, prefiro usar uma comparação explícita para tornar clara a intenção e melhorar a legibilidade. Observe que outros idiomas, como o C #, proíbem uma conversão implícita para impedir a possibilidade de introduzir sutis erros de programação.C ++ 20 nos dá
std::map::contains
para fazer isso.fonte
Você pode usar
.find()
:fonte
Se você quiser usar outra API, encontre ir para
m.count(c)>0
fonte
Eu acho que você quer
map::find
. Sem.find("f")
for igual am.end()
, a chave não foi encontrada. Caso contrário, find retornará um iterador apontando para o elemento encontrado.O erro ocorre porque
p.first
é um iterador, que não funciona para inserção de fluxo. Mude sua última linha paracout << (p.first)->first;
.p
é um par de iteradores,p.first
é um iterador,p.first->first
é a string de chave.Um mapa pode ter apenas um elemento para uma determinada chave, portanto,
equal_range
não é muito útil. É definido para o mapa, porque é definido para todos os contêineres associativos, mas é muito mais interessante para o multimap.fonte
C++17
simplificou isso um pouco mais com umIf statement with initializer
. Desta forma, você pode ter o seu bolo e comê-lo também.fonte
verifique se a chave existe ou não e o número de retorno ocorre (0/1 no mapa):
verifique se a chave existe ou não e retorne o iterador:
na sua pergunta, o erro causado por uma
operator<<
sobrecarga incorreta , porquep.first
émap<string, string>
, você não pode imprimi-lo. tente isto:fonte
cout
pode significar algo muito diferente do quecount
Obviamente, se você quiser ficar mais sofisticado, sempre poderá modelar uma função que também tenha uma função encontrada e uma função não encontrada, algo como isto:
E use-o assim:
A desvantagem disso é criar um bom nome, "find_and_execute" é estranho e eu não consigo encontrar nada melhor do alto da minha cabeça ...
fonte
Tenha cuidado ao comparar o resultado da busca com o final, como no mapa 'm', como todas as respostas foram feitas acima de map :: iterator i = m.find ("f");
você não deve tentar executar nenhuma operação, como imprimir a chave ou o valor com o iterador i, se for igual a m.end (), caso contrário, isso causará uma falha de segmentação.
fonte
Comparando o código de std :: map :: find e std :: map :: count, eu diria que o primeiro pode render alguma vantagem de desempenho:
fonte
Sei que esta pergunta já tem boas respostas, mas acho que vale a pena compartilhar minha solução.
Ele funciona para ambos
std::map
eestd::vector<std::pair<T, U>>
está disponível no C ++ 11.fonte
Se você deseja comparar o par de mapa, pode usar este método:
Esta é uma técnica útil.
fonte
fonte