C ++ mapa emplace

C ++ mapa emplace
As funções C ++, emplace () e insert () fazem uma coisa semelhante. Quando o programador não se importa com as vantagens que Emplace tem, ele pode usar o insert (). Emplace constrói o elemento de interesse dentro do contêiner de interesse enquanto insera cópias do elemento de algum lugar ou movendo o elemento para o recipiente de interesse.

Cópia noção

Considere as duas listas a seguir de caracteres:

lista la = 'a', 'b', 'c', 'd';
lista lb = 'e', 'f', 'g', 'h';

'G' em lb pode ser copiado e colocado na frente de 'd' em LA, para ter,

lista la = 'a', 'b', 'c', 'g', 'd';
lista lb = 'e', 'f', 'g', 'h';

Mover noção

'G' em LB pode ser removido e colocado na frente de 'D' em LA, para ter,

lista la = 'a', 'b', 'c', 'g', 'd';
lista lb = '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_uniq.Emplace (args)
  • a.emplace_hint (p, args)
  • Conclusão

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 ()

mapa mp = "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 ()

mapa mp = "banana", "amarelo", "maracujá", "roxo", "melancia", "verde", "uva", "rosa";
par:: iterator, bool> pr = MP.emplace ("Strawberry", "Red");
cout << (pr.first)->primeiro << " => " << (pr.first)->segundo << " : " << pr.second << 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 é:

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 ()

mapa mp = "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.