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. Construída sobre os conceitos de templates que você aprendeu, a STL incorpora uma filosofia de design poderosa: separar o armazenamento de dados da manipulação de dados.
A STL é organizada em torno de três componentes principais que trabalham juntos:
| Componente | Propósito | Exemplos |
|---|---|---|
| Containers | Armazenam coleções de objetos | vector, map, set |
| Iteradores | Fornecem acesso aos elementos do container | Entrada, saída, acesso aleatório |
| Algoritmos | Realizam operações nos dados | sort, find, transform |
A percepção fundamental é que os algoritmos não conhecem os containers diretamente - eles funcionam 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 misturar e combinar - use qualquer algoritmo com qualquer contêiner compatível sem escrever código novo. A STL fornece implementações otimizadas e testadas em batalha para que você possa se concentrar em resolver problemas em vez de reinventar estruturas de dados comuns.
Desafio
FácilVamos construir um sistema simples de processamento de dados que demonstra a filosofia da STL de separar containers, iteradores e algoritmos. Você criará um módulo utilitário que trabalha com componentes da STL e um programa principal que mostra como essas peças se encaixam.
Você criará dois arquivos:
DataProcessor.h: Defina funções utilitárias que trabalham com containers STL através de iteradores, demonstrando a filosofia de design da STL.Crie uma função chamada
printVectorque recebe umstd::vector<int>&e imprime todos os elementos separados por espaços, seguidos por uma nova linha. Use iteradores (begin()eend()) para percorrer o container.Crie uma função chamada
sortAndPrintque recebe umstd::vector<int>&, ordena-o usandostd::sort, e então imprime os elementos ordenados separados por espaços seguidos por uma nova linha.Crie uma função chamada
findElementque recebe umstd::vector<int>&e um valorintpara pesquisar. Usestd::findpara localizar o elemento. Se encontrado, imprimaFound: <value>. Se não for encontrado, imprimaNot found: <value>.Crie uma função chamada
getSumque recebe umstd::vector<int>&e retorna 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 juntos.Leia cinco entradas (cada uma em uma linha separada):
- Primeiro número inteiro
- Segundo número inteiro
- Terceiro número inteiro
- Quarto número inteiro
- Um valor para pesquisar
Crie um
std::vector<int>e adicione os quatro primeiros números inteiros a ele. Em seguida, demonstre a filosofia da STL ao:- Imprimir
Original:seguido pela chamada deprintVector - Imprimir
Sorted:seguido pela chamada desortAndPrint - Chamar
findElementcom o valor de busca - Imprimir
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 através de iteradores, e como std::sort e std::find operam em qualquer container que forneça o tipo de iterador correto. Este é o poder do design da STL — os algoritmos são desacoplados dos containers, conectados apenas através de iteradores.
Folha de consulta
A Standard Template Library (STL) é uma coleção de classes e funções baseadas em templates que fornecem estruturas de dados e algoritmos comuns. Ela separa o armazenamento de dados da manipulação de dados.
A STL possui três componentes principais:
| Componente | Propósito | Exemplos |
|---|---|---|
| Containers | Armazenam coleções de objetos | vector, map, set |
| Iteradores | Fornecem acesso aos elementos do container | Entrada, saída, acesso aleatório |
| Algoritmos | Realizam operações nos dados | sort, find, transform |
Os algoritmos funcionam por meio de iteradores, não diretamente com os containers. Isso permite que um único algoritmo funcione com qualquer container compatível:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
// Ordenar usando iteradores
std::sort(nums.begin(), nums.end());
// Percorrer usando iteradores
for (int n : nums) {
std::cout << n << " ";
}
// Saída: 1 2 5 8 9
}Métodos comuns de iteradores:
begin()- retorna o iterador para o primeiro elementoend()- retorna o iterador para a posição após o último elemento
Algoritmos comuns da STL:
std::sort(begin, end)- ordena os elementos no intervalostd::find(begin, end, value)- procura por um valor no intervalo
Experimente você mesmo
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// Lê cinco números 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 quatro primeiros números 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 pelo 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 OOP
Arquivos ExternosBuild e Compilação em C++Arquivos Header e SourceNamespaces e EscopoIntrodução a OOP em C++Classes vs ObjetosO Ponteiro 'this'Métodos (Funções Membro)Atributos (Membros de Dados)Básico de Ctors e DtorsRecapitulação - Calculadora Simples4Propriedades de Classe
Membros de Instância vs EstáticosGetters e SettersFunções de Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRecapitulação - Gerenciador de Conta Bancária7Herança
Herança BásicaNíveis de Acesso na HerançaOrdem de Chamada de Ctor e DtorSobrescrita de MétodosFunções Virtuais e VTableHerança MúltiplaHerança VirtualRecapitulação - Hierarquia de Funcionários10Visão Geral da STL
Visão Geral e Filosofia da STLContainers da STLIteradoresAlgoritmos da STLFunctors e Expressões LambdaRecapitulação - Frequência de Palavras2Gerenciamento de Memória
Memória Stack vs HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Smart Pointers em C++RAII em C++Recapitulação - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de Acesso em C++Especificadores de Acesso em DetalhesOcultação de InformaçãoStruct vs ClassClasses Aninhadas e InternasRecapitulação - Sistema de Registros de Alunos8Polimorfismo
Polimorfismo de Compilação vs Tempo de ExecuçãoSobrecarga de FunçõesFunções Virtuais RevisitadasFunções Virtuais PurasClasses AbstratasDesign de Interfaces em C++Dynamic Casting e RTTIRecapitulação - Calculadora de Formas3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentaçãoListas de Inicialização do ConstrutorConstrutores DelegadosMergulho Profundo em DestrutoresRegra dos Três / Cinco / ZeroRecapitulação - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de StreamSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçãoTemplates de ClasseEspecialização de TemplatesTemplates VariádicosFundamentos de SFINAE e Type TraitsRecapitulação - Container Genérico