Visão geral e filosofia da STL
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 70 de 104.
A Standard Template Library (STL) é uma coleção de classes e funções baseadas em templates que fornecem estruturas de dados e algoritmos comuns. Baseada nos conceitos de templates que você aprendeu, a STL incorpora uma poderosa filosofia de design: separar o armazenamento de dados da manipulação de dados.
A STL é organizada em torno de três componentes principais que trabalham em conjunto:
| Componente | Finalidade | Exemplos |
|---|---|---|
| Contêineres | Armazenam coleções de objetos | vector, map, set |
| Iteradores | Fornecem acesso aos elementos do contêiner | Entrada, saída, acesso aleatório |
| Algoritmos | Realizam operações nos dados | sort, find, transform |
A ideia fundamental é que os algoritmos não conhecem diretamente os containers — eles trabalham por meio de iteradores. Isso significa que um único algoritmo sort funciona com vetores, arrays e qualquer container que forneça o tipo de iterador correto:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// Saída: 1 2 5 8 9
}Essa separação significa que você pode combinar livremente — usar qualquer algoritmo com qualquer contêiner compatível sem escrever código novo. A STL fornece implementações testadas e otimizadas, para que você possa se concentrar em resolver problemas em vez de reinventar estruturas de dados comuns.
Desafio
FácilVamos criar um sistema simples de processamento de dados que demonstra a filosofia da STL de separar contêineres, iteradores e algoritmos. Você criará um módulo utilitário que trabalha com componentes da STL e um programa principal que mostra como essas partes se encaixam.
Você criará dois arquivos:
DataProcessor.h: defina funções utilitárias que trabalham com contêineres da STL por meio de iteradores, demonstrando a filosofia de design da STL.Crie uma função chamada
printVectorque receba umstd::vector<int>&e imprima todos os elementos separados por espaços, seguidos por uma nova linha. Use iteradores (begin()eend()) para percorrer o contêiner.Crie uma função chamada
sortAndPrintque receba umstd::vector<int>&, ordene-o usandostd::sorte, em seguida, imprima os elementos ordenados separados por espaços, seguidos por uma nova linha.Crie uma função chamada
findElementque receba umstd::vector<int>&e um valorinta ser pesquisado. Usestd::findpara localizar o elemento. Se ele for encontrado, imprimaFound: <value>. Se não for encontrado, imprimaNot found: <value>.Crie uma função chamada
getSumque receba umstd::vector<int>&e retorne a soma de todos os elementos. Você pode usar um loop simples com iteradores para isso.main.cpp: leia as entradas e demonstre como os componentes da STL trabalham em conjunto.Leia cinco entradas (cada uma em uma linha separada):
- Primeiro inteiro
- Segundo inteiro
- Terceiro inteiro
- Quarto inteiro
- Um valor a ser pesquisado
Crie um
std::vector<int>e adicione os quatro primeiros inteiros a ele. Em seguida, demonstre a filosofia da STL:- Imprima
Original:seguido da chamada deprintVector - Imprima
Sorted:seguido da chamada desortAndPrint - Chame
findElementcom o valor pesquisado - Imprima
Sum: <result>usandogetSum
Por exemplo, com as entradas 5, 2, 8, 1 e 8:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16Com as entradas 10, 30, 20, 40 e 15:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100Observe como suas funções trabalham com o vetor por meio de iteradores e como std::sort e std::find operam em qualquer contêiner que forneça o tipo correto de iterador. Esse é o poder do design da STL: os algoritmos são desacoplados dos contêineres e conectados apenas por meio de iteradores.
Experimente você mesmo
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// Leia cinco inteiros da entrada
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: Crie um vector e adicione os primeiros quatro inteiros a ele
// TODO: Imprima "Original: " e chame printVector
// TODO: Imprima "Sorted: " e chame sortAndPrint
// TODO: Chame findElement com o valor de busca
// TODO: Imprima "Sum: " seguido do resultado de getSum
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