Como usar o vetor C ++

How Use C Vector



Introdução

Uma matriz é uma série dos mesmos tipos de objetos em locais de memória consecutivos. Uma matriz não pode aumentar ou reduzir o comprimento. Um vetor é como uma matriz, mas seu comprimento pode ser aumentado ou reduzido. Um vetor, portanto, tem muito mais operações do que uma matriz.

C ++ tem muitas bibliotecas, todas as quais formam a Biblioteca Padrão C ++. Uma dessas bibliotecas é a biblioteca de contêiner. Um contêiner é uma coleção de objetos e certas operações podem ser realizadas na coleção. Os contêineres C ++ podem ser agrupados em dois conjuntos: contêineres de sequência e contêineres associativos. Os contêineres de sequência são vetor, array (não é o mesmo array discutido anteriormente), deque, forward_list e list. Essas são coleções diferentes (estruturas de dados semelhantes a matrizes) e cada uma oferece compensações distintas.







Qualquer programador deve saber como decidir se deve usar um vetor, um array, um deque, um forward_list ou uma lista. Quando um programador precisa de uma estrutura que requer mais operações do que aquelas associadas a uma matriz comum, a matriz comum não deve ser usada.



Se a tarefa envolver inserções e exclusões frequentes no meio da sequência, uma lista ou forward_list deve ser usada. Se a tarefa envolver inserções e exclusões frequentes no início ou no final de uma sequência, um deque deve ser usado. Um vetor deve ser usado quando esses tipos de operações não são necessários.



Este artigo mostra como usar o vetor C ++. Você precisará de algum conhecimento de ponteiros, referências e matrizes C ++ para entender este artigo.





Classe e Objetos

Uma classe é um conjunto de variáveis ​​e funções que funcionam juntas, onde as variáveis ​​não têm valores atribuídos. Quando os valores são atribuídos às variáveis, uma classe se torna um objeto. Valores diferentes dados à mesma classe resultam em objetos diferentes; ou seja, objetos diferentes podem ser da mesma classe, mas têm valores diferentes. Criar um objeto a partir de uma classe também é conhecido como instanciar o objeto.

O termo vetor descreve uma classe. Um objeto criado a partir de um vetor possui um nome escolhido pelo programador.



Uma função que pertence a uma classe é necessária para instanciar um objeto da classe. Em C ++, essa função tem o mesmo nome que o nome da classe. Diferentes objetos criados (instanciados) a partir da classe têm nomes distintos dados a cada um deles pelo programador.

Criar um objeto de uma classe significa construir o objeto; também significa instanciar o objeto.

A classe vetorial

A classe vetorial já foi definida e está na biblioteca. Para usar a classe vetorial, um programador deve incluir o cabeçalho do vetor no arquivo com a seguinte diretiva de pré-processamento:

#incluir

Depois que o cabeçalho é incluído, todos os recursos de vetor (membros de dados e funções de membro) tornam-se acessíveis. Para usar o objeto de contagem para enviar dados para o terminal (console), o cabeçalho do objeto também deve ser incluído. Para escrever um programa com o vetor, no mínimo, os seguintes cabeçalhos devem ser incluídos:

#incluir
#incluir

Instanciando um vetor

intfoo[10];

Acima está a declaração de um array com o nome foo e o número de elementos 10. Este é um array de inteiros. A declaração de um vetor é semelhante. Para um vetor, o número de elementos é opcional, uma vez que o comprimento do vetor pode aumentar ou diminuir.

Neste ponto do programa, a classe do vetor já foi definida na biblioteca e o cabeçalho foi incluído. O vetor pode ser instanciado da seguinte forma:

horas::vetor <int>vtr(8);

Aqui, o vetor é da função construtora especial. O tipo de dados que o vetor manterá é int, entre colchetes angulares. O termo vtr é o nome escolhido pelo programador para o vetor. Finalmente, 8, entre parênteses, é o número provisório de inteiros que o vetor terá.

O termo std significa namespace padrão. Este termo deve ser seguido por dois pontos duplos, neste contexto. Qualquer pessoa pode escrever sua própria biblioteca de classes vetoriais e usá-la. No entanto, C ++ já possui uma biblioteca padrão com nomes padrão, incluindo vetor. Para usar um nome padrão, o nome padrão deve ser precedido por std ::. Para evitar digitar std :: cada vez no programa para um nome padrão, o arquivo do programa pode iniciar da seguinte maneira:

#incluir
#incluir
usando namespace std;

Sobrecarregando uma função

Quando duas ou mais assinaturas de função diferentes têm o mesmo nome, diz-se que esse nome está sobrecarregado. Quando uma função é chamada, o número e o tipo de argumentos determinam qual função é executada.

Construindo um Vetor

Construir um vetor significa instanciar (criar) um objeto vetorial. A função construtora está sobrecarregada da seguinte maneira:

nome do vetor

Isso cria um vetor de comprimento zero e tipo T. A instrução a seguir cria um vetor de comprimento zero do tipo float com o nome vtr:

vetor<flutuador>vtr;

nome do vetor (n)

Isso cria um vetor com n elementos do tipo T. Uma instrução para esse vetor com quatro elementos flutuantes é a seguinte:

vetor<flutuador>vtr(4);

nome do vetor (n, t)

Isso cria um vetor de n elementos inicializados com o valor t. A instrução a seguir cria um vetor de 5 elementos, onde cada elemento tem o valor 3.4:

vetor<flutuador>vtr(5, 3,4);

Construindo com inicialização

Um vetor pode ser construído (criado) e inicializado ao mesmo tempo, de uma das seguintes maneiras:

vetor<flutuador>vtr= {1,1, 2,2, 3,3, 4,4};

Ou

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};

Observe que não há parênteses logo após o nome do objeto. Os parênteses usados ​​logo após o nome do objeto devem ter a lista de inicializadores, da seguinte maneira:

vetor<flutuador>vtr({1,1, 2,2, 3,3, 4,4});

Um vetor pode ser construído e inicializado posteriormente com a lista de inicializadores. Neste caso, os parênteses não serão usados:

vetor<flutuador>vtr;
vtr= {1,1, 2,2, 3,3, 4,4};

vetor V2 (V1)

Este é um construtor de cópia. Ele cria um vetor V2 como uma cópia do vetor V1. O código a seguir ilustra isso:

vetor<flutuador>vtr1(5, 3,4);
vetor<flutuador>vtr2(vtr1);

Atribuição de um vetor durante a construção

Durante a construção, um vetor vazio pode ser criado enquanto outro é atribuído a ele, da seguinte maneira:

vetor<flutuador>vtr1{1,1, 2,2, 3,3, 4,4};
vetor<flutuador>vtr2=vtr1;

A segunda declaração é equivalente a:

vetor<flutuador>vtr2= {1,1, 2,2, 3,3, 4,4};

vetor const

Um vetor const é um vetor cujos elementos não podem ser alterados. Os valores neste vetor são somente leitura. Quando criado, o vetor aparece da seguinte forma:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};

Nesse tipo de vetor, nenhum elemento pode ser adicionado ou removido. Além disso, nenhum valor pode ser alterado.

Construindo com Iterator

Um modelo fornece uma representação genérica para um tipo de dados. Um iterador fornece uma representação genérica da varredura por meio dos valores de um contêiner. A sintaxe para criar um vetor com um iterador é a seguinte:

modelo<classe InputIterator>
vetor(InputIterator primeiro,InputIterator último,constAlocadorE =Alocador());

Isso constrói um vetor para o intervalo [primeiro, último) usando o alocador especificado, que será discutido posteriormente neste artigo.

Destruindo um vetor

Para destruir um vetor, basta permitir que ele saia do escopo e a destruição é tratada automaticamente.

Capacidade vetorial

size_type capacity () const noexcept

O número total de elementos que o vetor pode conter sem a necessidade de realocação é retornado pela função de membro de capacidade. Um segmento de código para isso é o seguinte:

vetor<flutuador>vtr(4);
intnum=vtr.capacidade();
custo<<num<< ' n';

A saída é 4.

reserva (n)

O espaço de memória nem sempre está disponível gratuitamente. O espaço extra pode ser reservado com antecedência. Considere o seguinte segmento de código:

vetor<flutuador>vtr(4);
vtr.reserva(6);
custo<<vtr.capacidade() << ' n';

A saída é 6. Portanto, o espaço extra reservado é 6 - 4 = 2 elementos. A função retorna void.

size () const noexcept

Isso retorna o número de elementos no vetor. O código a seguir ilustra essa função:

vetor<flutuador>vtr(4);
flutuadors=vtr.Tamanho();
custo<<s<< ' n';

A saída é 4.

encolher para caber()

Depois de dar capacidade extra a um vetor com a função reserve (), o vetor pode ser reduzido para caber em seu tamanho original. O código a seguir ilustra isso:

vetor<flutuador>vtr(4);
vtr.reserva(6);
vtr.encolher para caber();
ints=vtr.Tamanho();
custo<<s<< ' n';

A saída é 4 e não 6. A função retorna void.

redimensionar (sz), redimensionar (sz, c)

Isso redimensiona o vetor. Se o novo tamanho for menor que o antigo, os elementos no final serão apagados. Se o novo tamanho for mais longo, algum valor padrão será adicionado no final. Para adicionar um valor específico, use a função resize () com dois argumentos. O segmento de código a seguir ilustra o uso dessas duas funções:

vetor<flutuador>vtr1{1,1, 2,2, 3,3, 4,4};
vtr1.redimensionar(2);
custo<< 'Novo tamanho de vtr1:' <<vtr1.Tamanho() << ' n';
vetor<flutuador>vtr2{1,1, 2,2};
vtr2.redimensionar(4, 8,8);
custo<< 'vtr2:'<<vtr2[0] <<''<<vtr2[1] <<'
'
<<vtr2[2] <<''<<vtr2[3] << ' n';

O resultado é o seguinte:

Novo tamanho de vtr1: 2
vtr2: 1,1 2,2 8,8 8,8

As funções retornam nulas.

empty () const noexcept

Esta função retorna 1 para verdadeiro se não houver elementos no vetor e 0 para falso se o vetor estiver vazio. Se um vetor tiver 4 locais para um tipo específico de dados, como float, sem nenhum valor float, então esse vetor não está vazio. O código a seguir ilustra isso:

vetor<flutuador>vtr;
custo<<vtr.vazio() << ' n';
vetor<flutuador>vt(4);
custo<<de modo avazio() << ' n';

vetor<flutuador>v(4,3,5);
custo<<v.vazio() << ' n';

O resultado é o seguinte:

1
0
0

Acesso ao elemento vetorial

Um vetor pode ser subscrito (indexado) como uma matriz. A contagem do índice começa do zero.

vectorName [i]

A operação vectorName [i] retorna uma referência ao elemento no iºíndice do vetor. O código a seguir produz 3.3 para o vetor acima:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
flutuadorfl=vtr[2];
custo<<fl<< ' n';

vectorName [i] const

A operação vectorName [i] const é executada em vez de vectorName [i] quando o vetor é um vetor constante. Esta operação é usada no seguinte código:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
flutuadorfl=vtr[2];
custo<<fl<< ' n';

A expressão retorna uma referência constante ao iºelemento do vetor.

Atribuindo um valor com subscrito

Um valor pode ser atribuído a um vetor não constante, da seguinte maneira:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vtr[2] = 8,8;
custo<<vtr[2] << ' n';

A saída é 8,8.

vectorName.at (i)

vectorName.at (i) é como vectorName [i], mas vectorName.at (i) é mais confiável. O código a seguir mostra como esse vetor deve ser usado:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
flutuadorfl=vtr.no(2);
custo<<fl<< ' n';
no()é um membro do vetorfunção.

vectorName.at (i) const

vectorName.at (i) const é como vectorName [i] const, mas vectorName.at (i) const é mais confiável. vectorName.at (i) const é executado em vez de vectorName.at (i) quando o vetor é um vetor constante. Este vetor é usado no seguinte código:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
flutuadorfl=vtr.no(2);
custo<<fl<< ' n';
no() consté um membro do vetorfunção.

Atribuição de um valor com a função at ()

Um valor pode ser atribuído a um vetor não constante com a função at (), da seguinte maneira:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vtr.no(2) = 8,8;
custo<<vtr[2] << ' n';

A saída é 8,8.

Problema com Sub-Scripting

O problema com subscripting (indexação) é que se o índice estiver fora do intervalo, zero pode ser retornado ou um erro pode ser emitido em tempo de execução.

frente()

Isso retorna uma referência ao primeiro elemento do vetor sem remover o elemento. A saída do código a seguir é 1.1.

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
flutuadorfl=vtr.frente();
custo<<fl<< ' n';

O elemento não é removido do vetor.

front () const

Quando a construção do vetor é precedida por const, a expressão front () const é executada em vez de front (). Isso é usado no seguinte código:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
flutuadorfl=vtr.frente();
custo<<fl<< ' n';

Uma referência constante é retornada. O elemento não é removido do vetor.

de volta()

Isso retorna uma referência ao último elemento do vetor sem remover o elemento. A saída do código a seguir é 4.4.

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
flutuadorfl=vtr.de volta();
custo<<fl<< ' n';

back () const

Quando a construção do vetor é precedida por const, a expressão back () const é executada em vez de back (). Isso é usado no seguinte código:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
flutuadorfl=vtr.de volta();
custo<<fl<< ' n';

Uma referência constante é retornada. O elemento não é removido do vetor.

Acesso a dados vetoriais

data () noexcept; data () const noexcept;

Qualquer um deles retorna um ponteiro de modo que [data (), data () + size ()) é um intervalo válido.

Isso será abordado com mais detalhes posteriormente neste artigo.

Retornando Iteradores e o Vetor

Um iterador é como um ponteiro, mas tem mais funcionalidade do que um ponteiro.

begin () noexcept

Retorna um iterador que aponta para o primeiro elemento do vetor, como no seguinte segmento de código:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vetor<flutuador> ::iteradoriter=vtr.começar();
custo<< *iter<< ' n';

A saída é 1,1. Observe que a declaração que recebe o iterador foi declarada. O iterador é desreferenciado em uma expressão de retorno para obter o valor da mesma maneira que um ponteiro é desreferenciado.

begin () const noexcept;

Retorna um iterador que aponta para o primeiro elemento do vetor. Quando a construção do vetor é precedida por const, a expressão begin () const é executada em vez de begin (). Sob esta condição, o elemento correspondente no vetor não pode ser modificado. Isso é usado no seguinte código:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vetor<flutuador> ::const_iteratoriter=vtr.começar();
custo<< *iter<< ' n';

A saída é 1,1. Observe que const_iterator foi usado desta vez em vez de apenas iterador para receber o iterador retornado.

end () noexcept

Retorna um iterador que aponta imediatamente além do último elemento do vetor. Considere o seguinte segmento de código:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vetor<flutuador> ::iteradoriter=vtr.fim();
custo<< *iter<< ' n';

A saída é 0, o que não faz sentido, pois não há nenhum elemento concreto além do último elemento.

end () const noexcept

Retorna um iterador que aponta imediatamente além do último elemento do vetor. Quando a construção do vetor é precedida por const, a expressão end () const é executada em vez de end (). Considere o seguinte segmento de código:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vetor<flutuador> ::const_iteratoriter=vtr.fim();
custo<< *iter<< ' n';

A saída é 0. Observe que const_iterator foi usado desta vez em vez de apenas iterador para receber o iterador retornado.

Iteração reversa

É possível ter um iterador que itera do final até um pouco antes do primeiro elemento.

rbegin () noexcept

Retorna um iterador que aponta para o último elemento do vetor, como no seguinte segmento de código:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vetor<flutuador> ::reverse_iteratorrIter=vtr.rbegin();
custo<< *rIter<< ' n';

A saída é 4,4.

Observe que a declaração que recebe o iterador reverso foi declarada. O iterador é desreferenciado em uma expressão de retorno para obter o valor da mesma maneira que um ponteiro é desreferenciado.

rbegin () const noexcept;

Retorna um iterador que aponta para o último elemento do vetor. Quando a construção do vetor é precedida por const, a expressão rbegin () const é executada em vez de rbegin (). Sob esta condição, o elemento correspondente no vetor não pode ser modificado. Este recurso é usado no seguinte código:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vetor<flutuador> ::const_reverse_iteratorrIter=vtr.rbegin();
custo<< *rIter<< ' n';

A saída é 4,4.

Observe que const_reverse_iterator foi usado desta vez, em vez de apenas reverse_iterator, para receber o iterador retornado.

render () noexcept

Retorna um iterador que aponta antes do primeiro elemento do vetor. Considere o seguinte segmento de código:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vetor<flutuador> ::reverse_iteratorrIter=vtr.faz();
custo<< *rIter<< ' n';

A saída é 0, o que não faz sentido, pois não há nenhum elemento concreto imediatamente antes do primeiro elemento.

render () const noexcept

Retorna um iterador que aponta antes do primeiro elemento do vetor. Quando a construção do vetor é precedida por const, a expressão rend () const é executada em vez de rend (). Considere o seguinte segmento de código:

constvetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vetor<flutuador> ::const_reverse_iteratorrIter=vtr.faz();
custo<< *rIter<< ' n';

A saída é 0.

Observe que const_reverse_iterator foi usado desta vez, em vez de apenas reverse_iterator, para receber o iterador retornado.

Modificadores de vetor

Um modificador que modifica o vetor pode pegar ou retornar um iterador.

a.emplace (p, args)

Insere um objeto do tipo T construído com std :: forward (args) ... antes de p.

Para detalhes - veja mais tarde

inserir (iteratorPosition, value)

Insere uma cópia do valor na posição do iterador do vetor. Retorna o iterador (posição) no vetor onde a cópia foi colocada. O código a seguir mostra onde o valor foi colocado:

vetor<int>vtr{10, vinte, 30, 40};
vetor<int> ::iteradoriter=vtr.começar();
++iter;
++iter;
vtr.inserir(iter, 25);
custo<<vtr[1] << '' <<vtr[2]<< '
'
<<vtr[3] << ' n';

O resultado é: 20 25 30.

Observe que o iterador foi avançado (incrementado) como um ponteiro.

Uma lista de inicializadores também pode ser inserida, conforme o código a seguir ilustra:

vetor<int>vtr{10, vinte, 30, 40};
vetor<int> ::iteradoriter=vtr.começar();
++iter;
++iter;
vtr.inserir(iter, {25, 28});

custo<<vtr[1] << '' <<vtr[2]<< '
'
<<vtr[3]<< '' <<vtr[4] << ' n';

O resultado é: 20 25 28 30.

apagar (posição)

Remove um elemento na posição apontada pelo iterador e retorna a posição do iterador. O código a seguir ilustra isso:

vetor<int>vtr{10, vinte, 30, 40};
vetor<int> ::iteradoriter=vtr.começar();
++iter;
++iter;
vtr.apagar(iter);
custo<<vtr[0] << '' <<vtr[1] << '
'
<<vtr[2]<< ' n';

O resultado é: 10 20 40

push_back (t), push_back (rv)

Usado para adicionar um único elemento no final do vetor. Use push_back (t) da seguinte maneira:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vtr.retrocesso(5,5);
flutuadorfl=vtr[4];
custo<<fl<< ' n';

A saída é 5,5.

retrocesso(rv): -veja mais tarde.

pop_back ()

Remove o último elemento sem retorná-lo. O tamanho do vetor é reduzido em 1. O código a seguir ilustra isso:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vtr.pop_back();
flutuadors=vtr.Tamanho();
custo<<s<< ' n';

A saída é 3.

a.swap (b)

Dois vetores podem ser trocados, conforme ilustrado no seguinte segmento de código:

vetor<flutuador>vtr1{1,1, 2,2, 3,3, 4,4};
vetor<flutuador>vtr2{10, vinte};
vtr1.troca(vtr2);
custo<< 'vtr1:'<<vtr1[0] <<''<<vtr1[1] <<'
'
<<vtr1[2] <<''<<vtr1[3] << ' n';

custo<< 'vtr2:'<<vtr2[0] <<''<<vtr2[1] <<'
'
<<vtr2[2] <<''<<vtr2[3] << ' n';

O resultado é:

vtr1: 10 vinte 0 0
vtr2: 1,1 2,2 3,3 4,4

Observe que o comprimento de um vetor é aumentado, se necessário. Além disso, os valores que não tiveram substituições são substituídos por algum valor padrão.

Claro()

Remove todos os elementos do vetor, como o segmento de código a seguir ilustra:

vetor<flutuador>vtr{1,1, 2,2, 3,3, 4,4};
vtr.Claro();
custo<<vtr.Tamanho() << ' n';

A saída é 0.

Operadores relacionais e de igualdade para vetores

O == Operador

Retorna 1 para verdadeiro se os dois vetores tiverem o mesmo tamanho e os elementos correspondentes forem iguais; caso contrário, retorna 0 para falso. Por exemplo:

vetor<int>você{1, 2, 3};
vetor<int>V{4, 5, 6};
bool bl=você==V;
custo<<bl<< ' n';

A saída é 0.

O! = Operador

Retorna 1 para verdadeiro se os dois vetores não têm o mesmo tamanho e / ou os elementos correspondentes não são iguais; caso contrário, retorna 0 para falso. Por exemplo:

vetor<int>você{1, 2, 3};
vetor<int>V{4, 5, 6};
bool bl=você! =V;
custo<<bl<< ' n';

A saída é 1.

o

Retorna 1 para verdadeiro se o primeiro vetor for o subconjunto inicial do segundo vetor, com os elementos das duas partes iguais sendo os mesmos e na mesma ordem. Se ambos os vetores forem do mesmo tamanho e se moverem da esquerda para a direita e um elemento for encontrado no primeiro vetor que seja menor que o elemento correspondente no segundo vetor, então 1 ainda será retornado. Caso contrário, 0 para falso é retornado. Por exemplo:

vetor<int>você{3, 1, 1};
vetor<int>V{3, 2, 1};
bool bl=você<V;
custo<<bl<< ' n';

A saída é 1.

O> Operador

Retorna! (U

o<= Operator

Retorna U<= V, where U is the first vector and V is the second vector, according to the above definitions.

O> = Operador

Retorna! (U<= V), where U is the first vector and V is the second vector, according to the above definitions.

Conclusão

Um vetor é um exemplo de contêiner de sequência. Um vetor é uma forma melhor do array comum e é instanciado a partir de uma classe. Os vetores têm métodos que são classificados em: construção e atribuição, capacidade, acesso a elementos, acesso a dados, iteradores, modificadores e operadores numéricos sobrecarregados.

Existem outros containers de sequência, chamados list, forward_list e array. Se a tarefa envolver inserções e exclusões frequentes no meio da sequência, uma lista ou forward_list deve ser usada. Se a tarefa envolver inserções e exclusões frequentes no início ou no final da sequência, um deque deve ser usado. E assim, os vetores devem ser usados ​​apenas quando esses tipos de operações não são importantes.