std::lista em C++ com exemplo

⚡ Resumo Inteligente

std::lista em C++ É um contêiner de sequência implementado como uma lista duplamente encadeada, permitindo inserção e exclusão rápidas em qualquer posição, armazenando elementos em memória não contígua e suportando acesso sequencial bidirecional em vez de acesso aleatório.

  • 🔗 Lista duplamente encadeada: Cada elemento mantém links para seu nó anterior e seguinte, portanto os dados de std::list residem em memória não contígua.
  • ⚡ Inserção e exclusão rápidas: Adicionar ou remover um elemento em uma posição conhecida leva tempo constante, ao contrário de um vetor que desloca elementos.
  • 🚫 Sem acesso aleatório: Os elementos são alcançados por travessia sequencial a partir de qualquer extremidade, portanto, indexação como list[3] não está disponível.
  • 🧩 Construtores: Os construtores default, fill, range, copy, move e initializer-list criam um std::list de maneiras diferentes.
  • 🛠️ Funções de membro: push_front(), push_back(), insert(), erase(), size(), reverse() e merge() gerenciam o conteúdo da lista.
  • 🤖 Assistência de IA: O GitHub Copilot e assistentes semelhantes criam a estrutura básica de declarações std::list, iteradores e lógica de inserção ou remoção a partir de um comentário curto.

std::lista em C++

O que é uma lista std::list?

In C++A `std::list` refere-se a um contêiner de armazenamento. A `std::list` permite inserir e remover itens de qualquer lugar. A `std::list` é implementada como uma lista duplamente encadeada. Isso significa que os dados da lista podem ser acessados ​​bidirecionalmente e sequencialmente.

A lista da Biblioteca de Modelos Padrão não suporta acesso aleatório rápido, mas suporta acesso sequencial em todas as direções.

Você pode espalhar os elementos da lista em diferentes partes da memória. As informações necessárias para o acesso sequencial aos dados são armazenadas em um contêiner. O std::list pode expandir e diminuir em ambas as extremidades conforme necessário durante o tempo de execução. Um alocador interno atende automaticamente aos requisitos de armazenamento.

Essas características levantam uma questão prática: quando você deve realmente recorrer a uma lista?

Por que usar std::list?

Eis os motivos para usar std::list:

  • A classe `std::list` apresenta melhor desempenho em comparação com outros contêineres de sequência, como arrays e vetores.
  • Eles têm um desempenho melhor na inserção, movimentação e extracelementos de qualquer posição.
  • O std::list também se sai melhor com algoritmos que executam tais operações de forma intensiva.

Com os motivos esclarecidos, o próximo passo é a sintaxe que declara um deles.

Sintaxe da lista

Para definir o std::list, temos que importar o arquivo de cabeçalho. Aqui está a sintaxe de definição std::list:

template < class Type, class Alloc =allocator<T> > class list;

Aqui está uma descrição dos parâmetros acima:

  • T – Define o tipo de elemento contido. Você pode substituir T por qualquer tipo de dado, inclusive tipos definidos pelo usuário.
  • Alloc – Define o tipo do objeto alocador. Por padrão, utiliza o modelo de classe alocador. É dependente de valor e usa um modelo simples de alocação de memória.

Exemplo 1

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };

	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

Saída:

Saída do exemplo de criação e iteração de std::list

Aqui está uma captura de tela do código:

C++ Código que cria uma std::list e a imprime com um loop for.

Code Explicação:

  1. Inclua o arquivo de cabeçalho do algoritmo para usar suas funções.
  2. Inclua o arquivo de cabeçalho iostream para usar suas funções.
  3. Inclua o arquivo de cabeçalho da lista para usar suas funções.
  4. Chame a função main(). A lógica do programa deve ser adicionada ao corpo desta função.
  5. Crie uma lista chamada my_list com um conjunto de 4 inteiros.
  6. Usar um para laço Para criar uma variável de loop x, essa variável será usada para iterar sobre os elementos da lista.
  7. Imprima os valores da lista no console.
  8. Fim do corpo do loop for.
  9. Fim do corpo da função main().

C++ Listar funções

Aqui estão as funções std::list comuns:

função Descrição
inserir() Esta função insere um novo item antes da posição apontada pelo iterador.
retrocesso() Esta função adiciona um novo item no final da lista.
push_front() Adiciona um novo item no início da lista.
pop_front() Exclui o primeiro item da lista.
Tamanho() Esta função determina o número de elementos da lista.
frente() Para determina os primeiros itens da lista.
de volta() To determina o último item da lista.
marcha ré() Ele inverte os itens da lista.
mesclar () Ele mescla duas listas classificadas.

Construtores

Aqui está a lista de funções fornecida pelo arquivo de cabeçalho:

  • Construtor padrão std::list::list()- Cria uma lista vazia, ou seja, com zero elementos.
  • Construtor de preenchimento std::list::list()- Cria uma lista com n elementos e atribui um valor zero (0) a cada elemento.
  • Construtor de intervalo std::list::list() - cria uma lista com muitos elementos no intervalo do primeiro ao último.
  • Construtor de cópia std::list::list()- Cria uma lista com uma cópia de cada elemento contido na lista existente.
  • Construtor de movimento std::list::list() - cria uma lista com os elementos de outra lista usando a semântica de movimento.
  • Construtor de lista inicializador std::list::list() - Ele cria uma lista com os elementos de outra lista usando a semântica de movimentação.

Exemplo 2

#include <iostream>
#include <list>
using namespace std;
int main(void) {
	list<int> l;
	list<int> l1 = { 10, 20, 30 };
	list<int> l2(l1.begin(), l1.end());
	list<int> l3(move(l1));  
	cout << "Size of list l: " << l.size() << endl;
	cout << "List l2 contents: " << endl;
	for (auto it = l2.begin(); it != l2.end(); ++it)
	      cout << *it << endl;
	cout << "List l3 contents: " << endl;
	for (auto it = l3.begin(); it != l3.end(); ++it)
		cout << *it << endl;
	return 0;
}

Saída:

Saída do exemplo de construtores std::list

Aqui está uma captura de tela do código:

C++ Código demonstrando os construtores padrão, de intervalo e de movimentação de std::list

Code Explicação:

  1. Inclua o arquivo de cabeçalho iostream para usar suas funções.
  2. Inclua o arquivo de cabeçalho da lista para usar suas funções.
  3. Inclua o namespace std no código para usar suas classes sem chamá-lo.
  4. Chame a função main(). A lógica do programa deve ser adicionada ao corpo desta função.
  5. Crie uma lista vazia chamada l.
  6. Crie uma lista chamada l1 com um conjunto de 3 inteiros.
  7. Crie uma lista chamada l2 com todos os elementos da lista chamada l1, do início ao fim.
  8. Crie uma lista chamada l3 usando a semântica de movimentação. A lista l3 terá o mesmo conteúdo da lista l2.
  9. Imprima o tamanho da lista chamada l no console junto com outro texto.
  10. Imprima algum texto no console.
  11. Crie um iterador chamado ele e use-o para iterar sobre os elementos da lista chamada l2.
  12. Imprima os elementos da lista chamada l2 no console.
  13. Imprima algum texto no console.
  14. Crie um iterador chamado ele e use-o para iterar sobre os elementos da lista chamada l3.
  15. Imprima os elementos da lista chamada l3 no console.
  16. O programa deve retornar o valor após a conclusão bem-sucedida.
  17. Fim do corpo da função main().

Propriedades do contêiner

Aqui está a lista de propriedades do contêiner:

Propriedade Descrição
Seqüência Os contêineres de sequência ordenam seus elementos em uma sequência linear estrita. Os elementos são acessados ​​por sua posição na sequência.
Lista duplamente vinculada Cada elemento contém informações sobre como localizar os elementos anteriores e seguintes. Isso permite um tempo constante para operações de inserção e exclusão.
Consciente do alocador Um objeto alocador é usado para modificar o tamanho do armazenamento dinamicamente.

Inserindo em uma lista

Existem diferentes funções que podemos usar para inserir valores em uma lista. Vamos demonstrar isso:

Exemplo 3

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	my_list.push_front(11);
	my_list.push_back(18);
	auto it = std::find(my_list.begin(), my_list.end(), 10);
	if (it != my_list.end()) {
		my_list.insert(it, 21);
	}
	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

Saída:

Saída após inserir elementos em uma std::list

Aqui está uma captura de tela do código:

C++ Código usando push_front, push_back e insert em uma std::list

Code Explicação:

  1. Inclua o arquivo de cabeçalho do algoritmo para usar suas funções.
  2. Inclua o arquivo de cabeçalho iostream para usar suas funções.
  3. Inclua o arquivo de cabeçalho da lista para usar suas funções.
  4. Chame a função main(). A lógica do programa deve ser adicionada ao corpo desta função.
  5. Crie uma lista chamada my_list com um conjunto de 4 inteiros.
  6. Insira o elemento 11 no início da lista chamada my_list.
  7. Insira o elemento 18 no final da lista chamada my_list.
  8. Crie um iterador e use-o para encontrar o elemento 10 da lista my_list.
  9. Use uma instrução if para determinar se o elemento acima foi encontrado ou não.
  10. Insira o elemento 21 antes do elemento acima, se for encontrado.
  11. Fim do corpo da instrução if.
  12. Use um loop for para criar uma variável de loop x. Esta variável será usada para iterar sobre os elementos da lista.
  13. Imprima os valores da lista no console.
  14. Fim do corpo do loop for.
  15. Fim do corpo da função main().

Os elementos que entram em uma lista podem ser removidos com a mesma facilidade.

Excluindo de uma lista

É possível excluir itens de uma lista. A função erase() permite excluir um item ou um intervalo de itens de uma lista.

  • Para deletar um único item, basta passar uma posição inteira. O item será excluído.
  • Para excluir um intervalo, você passa os iteradores inicial e final. Vamos demonstrar isso.

Exemplo 4

#include <algorithm>
#include <iostream>
#include <list>
using namespace std;
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	cout << "List elements before deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	list<int>::iterator i = my_list.begin();
	my_list.erase(i);
	cout << "\nList elements after deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	return 0;
}

Saída:

Saída após a exclusão de um elemento de uma std::list

Aqui está uma captura de tela do código:

C++ Código que utiliza a função erase em uma std::list

Code Explicação:

  1. Inclua o arquivo de cabeçalho do algoritmo para usar suas funções.
  2. Inclua o arquivo de cabeçalho iostream para usar suas funções.
  3. Inclua o arquivo de cabeçalho da lista para usar suas funções.
  4. Inclua o namespace std em nosso programa para usar suas classes sem chamá-lo.
  5. Chame a função main(). A lógica do programa deve ser adicionada ao corpo desta função.
  6. Crie uma lista chamada my_list com um conjunto de 4 inteiros.
  7. Imprima algum texto no console.
  8. Use um loop for para criar uma variável de loop x. Esta variável será usada para iterar sobre os elementos da lista.
  9. Imprima os valores da lista no console.
  10. Fim do corpo do loop for.
  11. Crie um iterador i que aponte para o primeiro elemento da lista.
  12. Use a função erase() apontada pelo iterador i.
  13. Imprima algum texto no console.
  14. Use um loop for para criar uma variável de loop x. Esta variável será usada para iterar sobre os elementos da lista.
  15. Imprima os valores da lista no console. Isso ocorre após a exclusão.
  16. Fim do corpo do loop for.
  17. O programa deve retornar um valor após a conclusão bem-sucedida.
  18. Fim do corpo da função main().

Perguntas Frequentes

std::vector armazena elementos em memória contígua com acesso aleatório O(1), enquanto std::list é uma lista duplamente encadeada que permite inserção ou remoção em qualquer lugar com complexidade O(1). Escolha vector para indexação e list para inserções frequentes no meio da lista.

Não. std::list não possui operador de acesso aleatório, portanto list[2] não compila. Você acessa um elemento iterando de begin() ou end() um nó por vez, o que tem complexidade linear O(n) para uma posição profunda.

`std::list` é uma lista duplamente encadeada que percorre os dois sentidos e suporta `push_back`. `std::forward_list` é uma lista simplesmente encadeada que percorre apenas para frente, usa menos memória por nó e não fornece iteradores `size()` ou `reverse()`.

Chame a função membro `my_list.sort()`, que tem complexidade de tempo aproximada de N log N e mantém a estabilidade dos elementos iguais. O algoritmo `std::sort` não funcionará, pois requer iteradores de acesso aleatório. Passe `std::greater` para `sort()` para ordenar em ordem decrescente.

Inserir ou excluir um nó tem complexidade de tempo constante O(1) assim que você tiver um iterador para a posição, porque apenas os ponteiros vizinhos mudam. Encontrar essa posição primeiro por meio de travessia ainda custa tempo O(n).

Sim. Um `std::list` não é um conjunto, portanto, armazena valores repetidos livremente. Cada `push_back`, `push_front` ou `insert` adiciona um novo nó, independentemente do conteúdo existente. Use `std::set` quando precisar rejeitar elementos duplicados.

Sim. Travas deslizantes portáteis Copiloto do GitHub Escreve declarações de std::list, loops de iteradores e chamadas de inserção ou eliminação a partir de um comentário curto ou nome de função. Frequentemente sugere std::vector quando o armazenamento contíguo é mais adequado para a tarefa.

Assistentes de codificação com IA completam automaticamente o código de contêineres da STL, sinalizam o uso incorreto de iteradores, convertem um `std::list` em um `std::vector` e explicam as compensações de complexidade. Eles aceleram o aprendizado da STL, embora cada sugestão ainda precise ser revisada.

Resuma esta postagem com: