Dominando std::list em C++: Sintaxe, Funções e Exemplos Práticos
O que é std::list?
Em C++, std::list é um contêiner de sequência que armazena elementos como uma lista duplamente encadeada. Essa estrutura permite inserir ou remover itens em qualquer posição em tempo constante, além de iterar sobre a lista em ambas as direções. Embora não forneça acesso aleatório rápido como std::vector, ela se destaca em cenários onde ocorrem inserções ou exclusões frequentes.
O contêiner gerencia automaticamente a memória por meio de um alocador, podendo crescer ou diminuir em ambas as extremidades durante a execução.
Por que usar std::list?
- Inserção e exclusão em tempo constante em qualquer posição da sequência.
- Eficiente para algoritmos que movem elementos com frequência.
- Ideal quando o tamanho do contêiner muda de forma imprevisível.
Definindo uma Lista
Para usar std::list, inclua o cabeçalho <list>:
#include <list> // Definição do template // template<class T, class Alloc = std::allocator<T>> class list;
Parâmetros:
T– Tipo dos elementos armazenados. Qualquer tipo copiável é permitido.Alloc– Tipo do alocador. Ostd::allocatorpadrão costuma ser suficiente.
Exemplo 1: Iteração Básica
#include <iostream>
#include <list>
int main() {
std::list<int> minha_lista{12, 5, 10, 9};
for (int x : minha_lista) {
std::cout << x << '\n';
}
}
Saída:

Operações Comuns do std::list
| Função | Descrição |
|---|---|
insert() | Insere um elemento antes da posição do iterador. |
push_back() | Adiciona um elemento ao final. |
push_front() | Adiciona um elemento ao início. |
pop_front() | Remove o primeiro elemento. |
size() | Retorna o número de elementos. |
front() | Acessa o primeiro elemento. |
back() | Acessa o último elemento. |
reverse() | Inverte a ordem dos elementos. |
merge() | Mescla duas listas ordenadas em uma. |
Construtores
std::list()– Construtor padrão; cria uma lista vazia.std::list(n)– Construtor de preenchimento; crianelementos construídos por padrão.std::list(first, last)– Construtor de intervalo; copia elementos de outro intervalo.std::list(const list&)– Construtor de cópia.std::list(list&&)– Construtor de movimento.std::list(std::initializer_list<T>)– Construtor de lista de inicialização.
Exemplo 2: Variantes de Construtores
#include <iostream>
#include <list>
int main() {
std::list<int> l; // vazia
std::list<int> l1{10, 20, 30};
std::list<int> l2(l1.begin(), l1.end()); // cópia de intervalo
std::list<int> l3(std::move(l1)); // movimento
std::cout << "Tamanho de l: " << l.size() << '\n';
std::cout << "Conteúdo de l2:\n";
for (int x : l2) std::cout << x << '\n';
std::cout << "Conteúdo de l3:\n";
for (int x : l3) std::cout << x << '\n';
}
Saída:

Propriedades do Contêiner
- Sequência – Elementos armazenados em ordem linear acessíveis por posição.
- Lista duplamente encadeada – Cada nó conhece seu predecessor e sucessor, permitindo inserções/exclusões em tempo constante.
- Consciente de alocador – Usa um alocador para solicitar memória conforme necessário.
Inserindo Elementos
Use push_front, push_back ou insert para adicionar itens.
Exemplo 3: Inserções Mistas
#include <algorithm>
#include <iostream>
#include <list>
int main() {
std::list<int> minha_lista{12, 5, 10, 9};
minha_lista.push_front(11); // início
minha_lista.push_back(18); // fim
auto it = std::find(minha_lista.begin(), minha_lista.end(), 10);
if (it != minha_lista.end()) {
minha_lista.insert(it, 21); // antes do 10
}
for (int x : minha_lista) std::cout << x << '\n';
}
Saída:

Excluindo Elementos
Use erase para remover elementos únicos ou intervalos.
Exemplo 4: Demonstração de Erase
#include <iostream>
#include <list>
int main() {
std::list<int> minha_lista{12, 5, 10, 9};
std::cout << "Antes da exclusão:\n";
for (int x : minha_lista) std::cout << x << '\n';
minha_lista.erase(minha_lista.begin()); // remove o primeiro
std::cout << "Após a exclusão:\n";
for (int x : minha_lista) std::cout << x << '\n';
}
Saída:

Principais Conclusões
std::listé um contêiner de sequência duplamente encadeado.- Oferece inserções/exclusões em tempo constante a partir de qualquer posição.
- Travessia sequencial suportada em ambas as direções.
- Acesso aleatório não é eficiente; use
std::vectorquando precisar de indexação rápida. - Construtores, iteradores e consciência de alocador tornam
std::listversátil para conjuntos de dados dinâmicos.
Linguagem C
- Operadores em C++ Explicados: Tipos, Exemplos e Programas Práticos
- Laço do-while em C++: Sintaxe, Exemplos Práticos e Loops Aninhados
- Dominando Switch-Case em C++: Sintaxe, Uso e Exemplos Práticos
- Dominando Alocação Dinâmica de Arrays em C++: Guia Prático com Exemplos de Código
- Dominando Ponteiros em C++: Conceitos, Exemplos e Aplicações Práticas
- Sobrecarga de Operadores em C++: Guia Prático com Exemplos de Código
- Structs em C++ Explicadas com Exemplo Prático
- Funções em C++ Explicadas com Exemplos Práticos de Código
- C++ Struct vs Class: Diferenças Principais, Sintaxe e Melhores Casos de Uso
- Counter do Python em collections: Contagem Eficiente, Atualização e Operações Aritméticas