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: