Cópia noção
Considere as duas listas a seguir de caracteres:
listala = 'a', 'b', 'c', 'd';
listalb = 'e', 'f', 'g', 'h';
'G' em lb pode ser copiado e colocado na frente de 'd' em LA, para ter,
listala = 'a', 'b', 'c', 'g', 'd';
listalb = 'e', 'f', 'g', 'h';
Mover noção
'G' em LB pode ser removido e colocado na frente de 'D' em LA, para ter,
listala = 'a', 'b', 'c', 'g', 'd';
listalb = 'e', 'f', 'h';
Valor no elemento
Copiar e se mover não são tão fraudados quanto mostrados acima. Em uma situação real, cada valor (e.g., personagem) está em um elemento. Então, se uma lista de chars tiver quatro caracteres, a lista tem quatro elementos. Se uma lista de chars tiver três caracteres, a lista tem três elementos.
Um elemento pode ser uma estrutura com 3 membros de dados. O primeiro membro de dados é um ponteiro que aponta para o elemento anterior na lista. O segundo membro de dados detém o valor, neste caso, o personagem. O terceiro membro de dados é um ponteiro que aponta para o próximo elemento na lista.
Portanto, cada personagem, como 'g' acima, seria mantido pelo segundo membro de dados de uma estrutura. No caso da lista original, LB acima, e para 'G', o primeiro membro de dados da estrutura, apontaria para o elemento que tem 'f', e o terceiro membro de dados da estrutura apontaria para o elemento que cerquilha'.
Inserir e emplace
Quando insert () tem que copiar conforme expresso acima, o elemento de 'g', eu.e., A estrutura completa será copiada e colocada em frente ao elemento 'd', em teoria. Na prática, depois que um novo elemento correspondente é considerado colocado em frente ao elemento 'D', o terceiro membro de dados da nova estrutura de G será feito para apontar para o elemento 'D'; e o primeiro membro de dados da nova estrutura G será feito para apontar para o elemento 'C' (da Lista LA).
Quando Insert () deve se mover conforme expresso acima, a cópia como explicada aqui é feita, então o elemento 'G' na lista LB é removido.
Emplace (), por outro lado, não precisa copiar ou mover nenhum elemento. Só precisa ser indicado ao programa que o valor do interesse é o personagem, 'g'. O programa construirá um novo elemento com 'G' como o valor na frente do elemento 'D' na lista, la. Ou seja, ele criará uma nova estrutura 'G' na frente do elemento 'D', com o terceiro membro de dados apontando para o elemento 'D' e o primeiro membro de dados apontando para o elemento 'C', como parte do Procedimento de construção.
Portanto, a principal diferença entre insert () e emplace () é que emplace () constrói o elemento de inserção no local, enquanto inserção () precisa copiar ou mover o elemento.
Este artigo explica o que é mapa-emplace e como usar as duas principais funções de membros do emplace do mapa.
Conteúdo do artigo
O elemento do mapa
A seguir, são apresentados quatro nomes de frutas e suas cores externas:
banana => amarelo
maracujá => roxo
melancia => verde
uva => rosa
Um mapa consiste em pares de chave/valor. Nesta lista comum, os nomes dos frutos são as chaves, e os nomes das cores externas são os valores. No entanto, esta é uma lista de pares, não apenas uma lista de valores, e não uma lista de chaves sozinha. É uma lista de pares de chave/valor. As chaves de um mapa são únicas.
No código, uma chave e seu valor são codificados como um elemento, chamado de par. Cada elemento seria apontado por um iterador. Portanto, um elemento de mapa vê uma chave como um valor, e a chave corresponde a outro valor. Portanto, um elemento de mapa precisa de dois valores para criar um elemento; não é como expresso na introdução acima. Esses dois valores estão em algum código, chamados de par.
O modelo para o elemento mapa é:
par
O primeiro parâmetro é para a chave e é indicado como key_type. O segundo parâmetro é para o valor que corresponde à chave. É indicado como mapeado_type e não value_type. value_type é realmente:
par
o modelo de elemento. Com a matriz, os índices são para valores. Com o mapa, os iteradores devem pares. Um par é um valor, que pode ser mantido pelo segundo membro de dados de uma estrutura, e o terceiro membro de dados apontando para o próximo elemento, que também tem um par como valor; e o primeiro membro de dados apontando para o elemento anterior, cujo valor é algum outro par.
Na lista de frutas/cores acima, o primeiro par pode ser codificado da seguinte forma:
"banana", "amarelo"
"Banana" é a chave e "amarelo" é o valor, formando um par de chaves/valor. Toda a lista restrita de dois valores é um valor de value_type e pode ser mantida pelo membro do meio de dados de um elemento de estrutura. O primeiro membro de dados da estrutura apontará para o elemento anterior, e o terceiro membro de dados da estrutura apontará para o próximo elemento.
Agora, um par é um objeto cuja chave tem o nome do membro primeiro e cujo valor tem o nome do membro segundo.
O programa a seguir coloca a lista acima de frutas/cores em um mapa:
#incluir
#incluir
usando namespace std;
int main ()
mapamp = "banana", "amarelo", "maracujá", "roxo", "melancia", "verde", "uva", "rosa";
para (mapa:: iterator it = MP.começar(); isto != MP.fim(); IT ++)
cout << it->primeiro << " => " << it->segundo << endl;
retornar 0;
A saída é:
banana => amarelo
maracujá => roxo
melancia => verde
uva => rosa
Observe que a biblioteca do mapa teve que ser incluída.
Par heterogêneo
Um par não deve necessariamente ter uma chave e valor que faça sentido para o usuário comum. Também pode ter uma chave e valor que não faz sentido para o usuário comum, mas faz sentido para o programador. Como exemplo para um par de chaves/valor que faz sentido para o programador, a chave pode ser um iterador e o valor, um tipo bool.
a_uniq.Emplace (args)
Aqui, a_uniq é o nome do mapa. args são a chave e o valor para o par, separados por uma vírgula. A função de membro retorna um par, cujo primeiro valor é um iterador (value_type); e cujo segundo valor é um bool, para indicar se a inserção (construída no local) foi bem -sucedida (verdadeira para o sucesso). O iterador retornado aponta para o elemento inserido. A especificação C ++ não indica onde a inserção deve ocorrer dentro da lista (ou na frente ou atrás) para esta função. O programa a seguir ilustra o uso da função:
#incluir
#incluir
usando namespace std;
int main ()
mapamp = "banana", "amarelo", "maracujá", "roxo", "melancia", "verde", "uva", "rosa";
par
A saída é:
Strawberry => Vermelho: 1
morango => vermelho
banana => amarelo
maracujá => roxo
melancia => verde
uva => rosa
1 na primeira linha de saída significa verdadeiro. Observe como o Args foi codificado como ("Strawberry", "Red"). Não confunda entre value_type e mapeado _type.
a.emplace_hint (p, args)
Aqui, 'a' é o nome do mapa. Essa função de membro é semelhante ao acima, mas a posição em que a colocação deve ocorrer na lista de mapas é sugerida. É um iterador, P apontando para o elemento antes e próximo ao qual a inserção (colocação) será colocada na memória. A função retorna um iterador e não um par. O iterador aponta para o elemento recém -inserido (par). O programa a seguir ilustra o seguinte:
#incluir
#incluir
usando namespace std;
int main ()
mapamp = "banana", "amarelo", "maracujá", "roxo", "melancia", "verde", "uva", "rosa";
mapa:: iterador p = MP.fim();
P--;
mapa:: iterator iter = MP.emplace_hint (P, "Strawberry", "Red");
cout << iter->primeiro << " => " << iter->segundo << endl;
cout << endl;
para (mapa:: iterator it = MP.começar(); isto != MP.fim(); IT ++)
cout << it->primeiro << " => " << it->segundo << endl;
retornar 0;
A saída é:
morango => vermelho
morango => vermelho
banana => amarelo
maracujá => roxo
melancia => verde
uva => rosa
Conclusão
Emplace e Insert são semelhantes. Emplace constrói seu elemento no local da lista, depois de obter o valor, de alguma forma. Por outro lado, insira copia seu elemento na lista de algum lugar ou move o elemento para a lista de algum lugar.
Nota: Um mapa é normalmente criado classificado por chaves. Para conseguir isso para o mapa acima, use objetos de string para as chaves em vez de pontos constantes para cartas.