Recipientes únicos e ordenados em C ++

Recipientes únicos e ordenados em C ++
6, 10, 2, 8, 4 é um conjunto; 2, 4, 6, 8, 10 é um conjunto dos mesmos números inteiros, organizados em ordem ascendente. Em matemática, um conjunto tem elementos únicos (elementos distintos), e ou seja, nenhum elemento ocorre mais de uma vez. Além disso, um multiset é um conjunto, onde qualquer elemento pode ocorrer mais de uma vez. 6, 6, 10, 2, 2, 8, 4, 4, 4 é um multiset. 2, 2, 4, 4, 4, 6, 6, 8, 10 é o mesmo multiset, mas com os elementos dispostos em ordem ascendente. Este artigo não lida com multiset. Ele lida com a estrutura de dados C ++ chamada, set.

Um mapa no software é como uma matriz, mas é uma matriz com duas colunas em vez de uma. A primeira coluna tem as chaves e a segunda coluna tem os valores. Cada linha é um par, fazendo um par de chaves/valor. Uma chave está diretamente relacionada ao seu valor.

Um exemplo de um mapa é 'c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10. O primeiro par de chave/valor inserido aqui é 'c', 3, onde 'c' é a chave e 30 é o valor. Este mapa não é ordenado por chaves. Encomendar este mapa por Keys produz 'a', 10, 'b', 20, 'c', 30, 'd', 30, 'e', 40. Observe que pode haver valores duplicados, mas não chaves duplicadas. Um mapa ordenado é um mapa ordenado por chaves.

Um multiset é para um conjunto, pois um multimap é para um mapa. Isso significa que existem mapas com chaves duplicadas. Um exemplo de um multimap é 'a', 10, 'b', 20, 'b', 20, 'c', 30, 'c', 30, 'd ', 30, ' e ', 40. E, como afirmado acima, este artigo não lida com o MultiMap, mas lida com a estrutura de dados C ++ chamada, mapa.

Em C ++, uma estrutura de dados é uma estrutura com propriedades (membros de dados) e métodos (funções membros). Os dados da estrutura são uma lista; um conjunto é uma lista; Um mapa é uma lista de pares de chave/valor.

Este artigo discute o básico de conjuntos e mapas em C ++ e, para entender melhor este artigo, o leitor deveria ter um conhecimento básico de C++.

Conteúdo do artigo:

  • Classe e seus objetos
  • Criando um conjunto ou um mapa
  • Básicos do iterador
  • Acesso a elementos para conjunto e mapa
  • Ordem dos elementos em um conjunto ou mapa
  • Outras funções de membro comumente usadas
  • Conclusão

Classe e seus objetos:

Em C ++, o conjunto, o mapa e outras estruturas semelhantes são chamadas de contêineres. Uma classe é uma unidade generalizada com membros de dados, que são variáveis ​​e funções de membro que estão relacionadas. Quando os membros dos dados recebem valores, um objeto é formado. No entanto, um objeto é formado em um processo chamado, instanciação. Como uma classe pode levar a valores diferentes para as mesmas variáveis ​​de membros de dados, objetos diferentes podem ser instanciados da mesma classe.

Em C ++, um conjunto inutilizável é uma classe, bem como um mapa inutilizável. Quando um objeto é instanciado do conjunto inutilizável ou do mapa inutilizável, o objeto se torna a estrutura de dados real. Com as estruturas de dados definidas e mapas, o principal membro de dados é uma lista. Bem, o conjunto e o mapa formam um grupo de contêineres chamados contêineres associativos ordenados. Conjunto não ordenado e o mapa não ordenado também existem, mas infelizmente não são abordados neste artigo.

Criando um conjunto ou um mapa:

Instantar um conjunto de sua classe Set está criando um conjunto; Instantar um mapa de sua classe de mapa está criando um mapa. O objeto assim criado recebe um nome da escolha do programador.

Para criar um conjunto, o programa deve começar com:

#incluir
#incluir
usando namespace std;

Observe a diretiva "#include", que inclui a biblioteca de conjuntos que possui a classe definida da qual as estruturas de dados definidas serão instantadas.

Para criar um mapa, o programa deve começar com:

#incluir
#incluir
usando namespace std;

Observe a diretiva "#include", que inclui a biblioteca de mapas que possui a classe de mapa a partir da qual as estruturas de dados do mapa serão instanciadas.

A sintaxe para criar um conjunto vazio é:

definir ObjectName

Exemplo:

definir setobj;

Um exemplo para criar um conjunto com conteúdo é:

definir setobj (6, 10, 2, 8, 4);

A sintaxe para criar um mapa vazio é:

mapa ObjectName

Exemplo:

mapa MapobJ;

Um exemplo para criar um mapa com conteúdo é:

mapa mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Básicos do iterador:

Um iterador é um ponteiro elaborado, que pode ser usado para atravessar a lista da estrutura de dados do início ao fim.

A função BEGIN () MEMBRO

A função Begin () Membro retorna um iterador que aponta para o primeiro elemento da lista. O exemplo a seguir ilustra isso para o conjunto:

definir setobj (6, 10, 2, 8, 4);
definir:: iterator iter = setobj.começar();
cout << *iter << '\n';

Observe o caminho BEGN () foi usado com SetoBJ e o operador de pontos. iter é o objeto de iter devolvido. Além disso, observe a maneira como foi declarada. * é o operador indiretivo. Como usado com o ITER, ele retorna o primeiro elemento do conjunto; O primeiro elemento é 2 em vez de 6 - veja a explicação abaixo.

O exemplo a seguir ilustra o uso da função Iniciar () para o mapa:

mapa mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: iterator iter = mapobj.começar();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Observe o caminho para começar () foi usado com o MAPOBJ e o operador DOT. iter é o objeto de iter devolvido. Além disso, observe a maneira como foi declarada. "Primeiro", como usado aqui, refere -se à chave. "Segundo" refere -se ao valor correspondente à chave. Observe como eles foram usados ​​com o ITER para obter os componentes do elemento inicial da lista. O primeiro elemento é a, 10 em vez de c, 30 - veja a explicação abaixo.

A função de membro "Begin () const"

A função de membro “Begin () const” retorna um iterador que aponta para o primeiro elemento da lista quando a declaração do conjunto começa com const (para constante). Sob essa condição, o valor da lista, referido pelo iterador retornado, não pode ser alterado pelo iterador. O exemplo a seguir ilustra seu uso para o conjunto:

const definido setobj (6, 10, 2, 8, 4);
definir:: const_iterator iter = setobj.começar();
cout << *iter << '\n';

Observe o caminho BEGN () foi usado com SetoBJ e o operador de pontos. Nenhum "const" foi digitado logo após o começo (). No entanto, "const" precedeu a declaração. aqui está o objeto de iterador constante retornado, que é diferente do iterador normal. Além disso, observe a maneira como foi declarada. * é o operador indiretivo; Como usado com o ITER, ele retorna o primeiro elemento do conjunto. O primeiro elemento é 2 em vez de 6 - veja a explicação abaixo.

O exemplo a seguir ilustra o uso da função "BEGIN () const" para o mapa:

const map mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: const_iterator iter = mapaBJ.começar();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Observe o caminho para começar () foi usado com o MAPOBJ e o operador DOT. Nenhum "const" foi digitado logo após o começo (). No entanto, "const" precedeu a declaração. aqui está o objeto de iterador constante retornado, que é diferente do iterador normal. Além disso, observe a maneira como foi declarada. "Primeiro", como usado aqui, refere -se à chave; "Segundo", como usado aqui, refere -se ao valor correspondente à chave. Observe como eles foram usados ​​com o ITER para obter os componentes do elemento inicial da lista. O primeiro elemento é a, 10 em vez de c, 30 - veja a explicação abaixo.

A função final () do membro

A função final () do membro retorna um iterador que aponta logo após o final da lista. O exemplo a seguir ilustra isso para o conjunto:

definir setobj (6, 10, 2, 8, 4);
definir:: iterator iter = setobj.fim();
cout << *iter << '\n';

Observe que a maneira final () foi usada com SetoBJ e o operador de pontos. iter é o objeto de iter devolvido. Além disso, observe a maneira como foi declarada. * é o operador indiretivo; Como usado com o ITER, ele retorna o último elemento+1 do conjunto. No computador do autor, este último elemento+1 é 5, que não está na lista. Então, cuidado para não usar este elemento.

O exemplo a seguir ilustra o uso da função final () para o mapa:

mapa mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: iterator iter = mapobj.fim();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Observe que a maneira final () foi usada com o MAPOBJ e o operador DOT. iter é o objeto de iter devolvido. Além disso, observe a maneira como foi declarada. * é o operador indiretivo; Como usado com o ITER, ele retorna o último elemento+1 do mapa. No computador do autor, este último elemento+1 é , 0, que não está na lista. Então, cuidado para não usar este elemento.

A função do membro "end () const"

A função de membro "end () const" retorna um iterador que aponta logo após o final da lista quando a declaração do conjunto começa com const (para constante). Sob essa condição, o valor da lista, referido pelo iterador retornado, não pode ser alterado pelo iterador. O exemplo a seguir ilustra seu uso para o conjunto:

const definido setobj (6, 10, 2, 8, 4);
definir:: const_iterator iter = setobj.fim();
cout << *iter << '\n';

Observe que a maneira final () foi usada com SetoBJ e o operador de pontos. Nenhum "const" foi digitado logo após o final (). No entanto, "const" precedeu a declaração. iter é o objeto de iter devolvido. Além disso, observe a maneira como foi declarada. * é o operador indiretivo; Como usado com o ITER, ele retorna o último elemento+1 do conjunto.

O exemplo a seguir ilustra o uso da função "end () const" para o mapa:

const map mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
mapa:: const_iterator iter = mapaBJ.fim();
cout << "" << (*iter).first <<',' << (*iter).second << "\n";

Observe que a maneira final () foi usada com o MAPOBJ e o operador DOT. Nenhum "const" foi digitado logo após o final (). No entanto, "const" precedeu a declaração. Iter é o objeto de iterador constante retornado, que é diferente do iterador normal. Além disso, observe cuidadosamente a maneira como foi declarada.

Acesso ao elemento para conjunto e mapa:

Definir

Com o conjunto, o elemento é lido usando o operador de indireção. Os dois primeiros elementos de um conjunto são lidos no exemplo a seguir:

definir setobj (6, 10, 2, 8, 4);
definir:: iterator iter = setobj.começar();
cout << *iter << '\n';
++iter;
cout << *iter << '\n';

A saída é 2, seguida por 4 - veja a explicação abaixo. Para apontar para o próximo elemento da lista, o iterador é incrementado.

NOTA: Um elemento não pode ser alterado usando o operador de indireção para o conjunto. Por exemplo, "*iter = 9;" não é possível.

mapa

Um mapa consiste em pares de chave/valor. Um valor pode ser lido usando a chave correspondente e alterado usando a mesma chave. O seguinte segmento de código ilustra o seguinte:

mapa mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj['b'] << '\n';
mapaBJ ['b'] = 55;
cout << mapObj['b'] << '\n';

A saída é:

20
55

O operador de pontos não foi usado aqui. Em vez.

Ordem dos elementos em um conjunto ou mapa:

Os elementos podem ser inseridos em um conjunto, em qualquer ordem. No entanto, uma vez inserido, o conjunto reorganiza seus elementos em ordem crescente. Ordem ascendente é a ordem padrão. Se for necessária uma ordem decrescente, o conjunto deverá ser declarado como no exemplo a seguir:

definir > setobj (6, 10, 2, 8, 4);

Então, depois do tipo, e.g., Int, para o modelo, há uma vírgula, seguida de "maior" nos suportes de ângulo.

Os elementos podem ser inseridos em um mapa em qualquer ordem. No entanto, uma vez inserido, o mapa reajave seus elementos em ordem ascendente por chave (somente), mantendo a relação entre cada chave e seu valor. Ordem ascendente é a ordem padrão; Se for necessária uma ordem decrescente, o mapa deverá ser declarado como no exemplo a seguir:

mapa > mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);

Então, depois do par de tipos, e.g., “Char, int”, para o modelo, há uma vírgula, seguida de “maior” nos suportes de ângulo.

Atravessando um conjunto

O loop while ou o loop para o iterador pode ser usado para atravessar um conjunto. O exemplo a seguir usa um loop for para atravessar um conjunto que foi configurado em ordem decrescente:

definir > setobj (6, 10, 2, 8, 4);
para (definido:: iterator iter = setobj.começar(); iter != setobj.fim(); ++ iter)

cout << *iter << ";

A saída é:

10 8 6 4 2

Incrementar um iterador aponta para o próximo elemento.

Atravessando um mapa

O loop while ou o loop com o iterador pode ser usado para atravessar um mapa. O exemplo a seguir usa um loop for para atravessar um mapa que foi configurado em ordem decrescente:

mapa > mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
para (mapa:: iterator iter = mapobj.começar(); iter != MapobJ.fim(); ++ iter)

cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

A saída é:

e, 40, d, 30, c, 30, b, 20, a, 10,

Incrementar um iterador aponta para o próximo elemento. "Primeiro", no código, refere -se à chave e "segundo" refere -se ao valor correspondente. Observe como esses valores foram obtidos para a saída.

Outras funções de membros comumente usadas:

A função size ()

Esta função retorna um número inteiro, que é o número de elementos na lista. Definir exemplo:

definir > setobj (6, 10, 2, 8, 4);
cout << setObj.size() << '\n';

A saída é 5.

Exemplo de mapa:

mapa > mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
cout << mapObj.size() << '\n';

A saída é 5.

A função insert ()

definir

o conjunto não permite duplicar. Portanto, qualquer inserido duplicado é rejeitado silenciosamente. Com o conjunto, o argumento da função insert () é o valor a ser inserido. O valor é montado em uma posição, na qual a ordem no conjunto permanece ascendente ou descendente. Exemplo:

definir setobj (6, 10, 2, 8, 4);
Setobj.inserir (6);
Setobj.inserir (9);
Setobj.inserir (12);
para (definido:: iterator iter = setobj.começar(); iter != setobj.fim(); ++ iter)

cout << *iter << ";

A saída é:

2 4 6 8 9 10 12

Nota: a função de membro insert () pode ser usada para preencher um conjunto vazio.

mapa

O mapa não permite duplicar por chave. Portanto, qualquer inserido duplicado é rejeitado silenciosamente. Com o mapa, o argumento para a função insert () é o par de chaves/valores no aparelho. O elemento é montado em uma posição por chave, na qual a ordem no mapa permanece ascendente ou descendente. Exemplo:

mapa mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
MapobJ.inserir ('e', 80);
MapobJ.inserir ('f', 50);
MapobJ.inserir ('g', 60);
para (mapa:: iterator iter = mapobj.começar(); iter != MapobJ.fim(); ++ iter)
cout << "" << (*iter).first << ", " << (*iter).second << "" << ", ";

A saída é:

a, 10, b, 20, c, 30, d, 30, e, 40, f, 50, g, 60,

NOTA: A função de membro insert () pode ser usada para preencher um mapa vazio.

A função vazia ()

Esta função retorna true se a lista estiver vazia e falsa se o contrário. Definir exemplo:

definir setobj (6, 10, 2, 8, 4);
bool ret = setobj.vazio();
cout << ret << '\n';

A saída é 0 para false, o que significa que o conjunto aqui não está vazio.

Exemplo de mapa:

mapa mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
bool ret = mapobj.vazio();
cout << ret << '\n';

A saída é 0 para falsa, o que significa que o mapa aqui não está vazio.

A função EASE ()

definir

Considere o seguinte segmento de código:

definir setobj (10, 20, 30, 40, 50);
definir:: iterator iter = setobj.começar();
definir:: iterator itr = setobj.apagar (iter);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';
itr = setobj.apagar (ITR);
cout << "new size: " << setObj.size() << '\n';
cout << "next value: " << *itr << '\n';

A saída é:

Novo tamanho: 4
Próximo valor: 20
Novo tamanho: 3
Próximo valor: 30

A função EASE () leva um iterador que aponta para um elemento como um argumento. Depois de apagar o elemento, a função EASE () retorna um iterador que aponta para o próximo elemento.

mapa

Considere o seguinte segmento de código:

mapa mapaBJ ('a', 10, 'b', 20, 'c', 30, 'd', 40, 'e', 50);
mapa:: iterator iter = mapobj.começar();
mapa:: iterator itr = mapobj.apagar (iter);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";
itr = mapaBJ.apagar (ITR);
cout << "new size: " << mapObj.size() << '\n';
cout << "next value pair: " << (*itr).first <<',' << (*itr).second << "\n";

A saída é:

Novo tamanho: 4
Próximo par de valor: b, 20
Novo tamanho: 3
PRÓXIMO PAR

A função EASE () leva um iterador que aponta para um elemento como um argumento. Depois de apagar o elemento, a função EASE () retorna um iterador que aponta para o próximo elemento.

A função clear ()

A função clear () remove todos os elementos da lista. Definir exemplo:

definir setobj (6, 10, 2, 8, 4);
Setobj.claro();
cout << setObj.size() << '\n';

A saída é 0.

Exemplo de mapa:

mapa mapaBJ ('c', 30, 'b', 20, 'd', 30, 'e', 40, 'a', 10);
MapobJ.claro();
cout << mapObj.size() << '\n';

A saída é 0.

Conclusão:

Uma estrutura de dados definida em C ++ é uma estrutura na qual a lista de elementos é armazenada em ordem crescente por padrão ou em ordem decrescente pela escolha do programador. Todos os elementos do conjunto são únicos. Uma estrutura de dados do mapa em C ++ é uma estrutura na qual a lista é um hash de pares de chave/valor, armazenado em ordem crescente de chaves por padrão ou em ordem decrescente de chaves pela escolha do programador. As chaves também são únicas e pode haver valores duplicados. O principal membro de dados de qualquer uma das estruturas é a lista. Qualquer estrutura tem funções de membro, algumas das quais comumente usadas.