Contêineres da STL
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 71 de 104.
Os contêineres da STL são classes de modelo que armazenam e organizam coleções de objetos. Cada tipo de contêiner é otimizado para diferentes padrões de acesso e operações. Escolher o contêiner adequado às suas necessidades pode impactar significativamente o desempenho do seu programa.
Contêineres de sequência mantêm elementos em uma ordem específica:
#include <vector>
#include <list>
std::vector<int> vec = {1, 2, 3}; // Array dinâmico, acesso aleatório rápido
vec.push_back(4); // Adicionar ao final: O(1) amortizado
int x = vec[2]; // Acesso por índice: O(1)
std::list<int> lst = {1, 2, 3}; // Lista duplamente encadeada
lst.push_front(0); // Adicionar ao início: O(1)
lst.push_back(4); // Adicionar ao final: O(1)Contêineres associativos armazenam elementos em ordem classificada para uma busca rápida:
#include <map>
#include <set>
std::set<int> s = {3, 1, 4, 1}; // Elementos únicos ordenados: {1, 3, 4}
s.insert(2); // Inserção: O(log n)
bool found = s.count(3); // Verificar existência: O(log n)
std::map<std::string, int> ages; // Pares chave-valor, ordenados pela chave
ages["Alice"] = 25; // Inserção/atualização: O(log n)
ages["Bob"] = 30;
std::cout << ages["Alice"]; // Acesso: O(log n)Unordered containers usam tabelas hash para uma busca média ainda mais rápida:
#include <unordered_map>
std::unordered_map<std::string, int> scores;
scores["player1"] = 100; // Inserção: O(1) em média
scores["player2"] = 200;
std::cout << scores["player1"]; // Acesso: O(1) em médiaUse vector quando precisar de acesso aleatório rápido, list para inserções frequentes no meio, map/set quando precisar de dados ordenados e unordered_map quando a velocidade de consulta for fundamental e a ordem não importar.
Desafio
FácilVamos criar um sistema de gerenciamento de notas de alunos que demonstra como diferentes contêineres da STL servem a diferentes propósitos. Você usará vários tipos de contêineres para organizar os dados dos alunos com eficiência, escolhendo o contêiner adequado para cada tarefa.
Você criará dois arquivos para organizar seu código:
GradeManager.h: defina uma classeGradeManagerque use vários contêineres da STL para gerenciar as informações dos alunos.Sua classe deve usar:
- Um
std::vector<std::string>para armazenar os nomes dos alunos na ordem em que foram adicionados - Um
std::map<std::string, int>para associar cada nome de aluno à sua nota - Um
std::set<int>para acompanhar todas as notas exclusivas atribuídas
Implemente estes métodos:
addStudent(const std::string& name, int grade): adiciona um aluno com sua nota aos três contêineresgetGrade(const std::string& name): retorna a nota de um determinado aluno usando o mapaprintRoster(): imprime todos os nomes dos alunos na ordem em que foram adicionados (a partir do vetor), cada um em uma nova linhaprintGrades(): imprime todos os alunos com suas notas em ordem alfabética (o mapa faz isso automaticamente), no formatoname: gradeem cada linhaprintUniqueGrades(): imprime todas as notas exclusivas em ordem crescente (o conjunto cuida disso), separadas por espaços e seguidas por uma quebra de linha
- Um
main.cpp: leia as entradas e demonstre como cada tipo de contêiner serve a um propósito diferente.Leia seis entradas (cada uma em uma linha separada):
- Nome do primeiro aluno
- Nota do primeiro aluno (inteiro)
- Nome do segundo aluno
- Nota do segundo aluno (inteiro)
- Nome do terceiro aluno
- Nota do terceiro aluno (inteiro)
Crie um
GradeManagere adicione os três alunos. Em seguida, demonstre os diferentes comportamentos dos contêineres:- Imprima
Roster (insertion order):e, em seguida, chameprintRoster() - Imprima
Grades (alphabetical):e, em seguida, chameprintGrades() - Imprima
Unique grades:e, em seguida, chameprintUniqueGrades() - Consulte a nota do segundo aluno e imprima
<name>'s grade: <grade>
Por exemplo, com as entradas Charlie, 85, Alice, 90, Bob, 85:
Roster (insertion order):
Charlie
Alice
Bob
Grades (alphabetical):
Alice: 90
Bob: 85
Charlie: 85
Unique grades:
85 90
Alice's grade: 90Observe como o vetor preserva a ordem de inserção (Charlie, Alice, Bob), o mapa classifica automaticamente pelas chaves (Alice, Bob, Charlie) e o conjunto armazena apenas valores exclusivos em ordem classificada (85 aparece uma vez, não duas). Cada tipo de contêiner se destaca em tarefas diferentes!
Experimente você mesmo
#include <iostream>
#include <string>
#include "GradeManager.h"
using namespace std;
int main() {
// Ler entradas para três alunos
string name1, name2, name3;
int grade1, grade2, grade3;
cin >> name1;
cin >> grade1;
cin >> name2;
cin >> grade2;
cin >> name3;
cin >> grade3;
// TODO: Criar um objeto GradeManager
// TODO: Adicionar todos os três alunos ao GradeManager
// TODO: Print "Roster (insertion order):" and call printRoster()
// TODO: Print "Grades (alphabetical):" and call printGrades()
// TODO: Print "Unique grades:" and call printUniqueGrades()
// TODO: Buscar a nota do segundo aluno e imprimir "<name>'s grade: <grade>"
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online