Um guia para iniciantes na biblioteca de modelos padrão em C ++
C ++ é uma das linguagens de programação mais poderosas e intimidantes que você pode encontrar como um iniciante. O motivo é bastante simples. Exige muito código para atingir a saída desejada. A biblioteca de modelos padrão, ou STL, pode ajudá-lo a resolver esse enigma.
Considerando a quantidade de tempo e esforço consumidos ao escrever código para funções como classificação e pesquisa, o STL pode ajudá-lo a realizar todas essas operações com apenas uma única linha de código. Esta biblioteca pode ser extremamente útil para a resolução de problemas e preparação para entrevistas técnicas.
O que é a biblioteca de modelos padrão?
A Standard Template Library, ou STL, é uma biblioteca C ++ que consiste em funções e contêineres pré-construídos. Inclui algumas classes de modelo proeminentes para estruturas de dados comuns, como vetores, pilhas, filas e algumas funções algorítmicas úteis, como pesquisa binária, para tornar a programação mais fácil.
A Biblioteca de Modelos Padrão em C ++ consiste em quatro componentes:
- Algoritmos
- Recipientes
- Funções
- Iteradores
Vamos dar uma olhada nos algoritmos e contêineres com mais detalhes, já que esses são os componentes mais comumente usados do STL.
Algoritmos em STL
O arquivo de cabeçalho <algorithm> é uma parte do STL que consiste em várias funções algorítmicas que podem ser usadas em vez de codificá-las manualmente. Alguns dos algoritmos incluídos são pesquisa binária, classificação e reverso, que são extremamente úteis.
Para começar, você precisa importar o cabeçalho <algorithm> em seu arquivo C ++. A sintaxe é a seguinte:
#include <algorithm>
Para os próximos métodos, considere uma variável de matriz com os valores de {6, 2, 9, 1, 4} como exemplo.
int arr[] = {6, 2, 9, 1, 4};
ordenar()
A função sort () ajuda a classificar todos os elementos dentro da estrutura de dados especificada em ordem crescente. Esta função leva dois parâmetros: o iterador inicial e o iterador final.
Sintaxe:
sort(start_iterator, end_iterator);
Aqui está um exemplo rápido:
sort(arr, arr+5);
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
Resultado:
1 2 4 6 9
marcha ré()
A função reverse () inverte a ordem dos elementos na estrutura de dados especificada. Ele aceita dois parâmetros: o iterador inicial e o iterador final.
Sintaxe:
reverse(start_iterator, end_iterator);
Aqui está um pequeno exemplo do método acima:
reverse(arr, arr+5);
for(int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
Resultado:
4 1 9 2 6
* min_element () e * max_element ()
As funções * max_element () e * min_element () retornam os valores máximo e mínimo dentro da estrutura de dados especificada, respectivamente. Ambas as funções aceitam dois argumentos: o iterador inicial e o iterador final.
Sintaxe:
*max_element(start_iterator, end_iterator);
*min_element(start_iterator, end_iterator);
Vamos descobrir quais valores essas funções retornam ao chamá-las na matriz de exemplo:
cout << *max_element(arr, arr+5) << endl;
cout << *min_element(arr, arr+5) << endl;
Resultado:
9
1
binary_search ()
O método binary_search () é usado para descobrir se o valor especificado está presente dentro da estrutura de dados ou não. Ele aceita três argumentos: o iterador inicial, o iterador final e o valor que você deseja encontrar.
A pesquisa binária só funciona em estruturas de dados classificadas. Portanto, você precisará chamar o método sort () antes do método binary_search () .
Sintaxe:
binary_search(start_iterator, end_iterator, value_to_find)
Aqui está uma demonstração desse método:
sort(arr, arr+5);
binary_search(arr, arr+5, 2) ? cout << "Element found" : cout << "Element not found";
binary_search(arr, arr+5, 7) ? cout << "Element found" : cout << "Element not found";
Resultado:
Element found
Element not found
contar()
O método count () retorna a contagem de ocorrência do valor especificado dentro da estrutura de dados. Recebe três argumentos: o iterador inicial, o iterador final e o valor a ser contado.
Sintaxe:
count(start_iterator, end_iterator, value_to_count);
Aqui está um exemplo desse método:
cout << count(arr, arr+5, 2) << endl;
Resultado:
1
Recipientes em STL
Os contêineres são as estruturas de dados que armazenam objetos e dados. Vetores, listas, pilhas, filas, conjuntos e mapas são alguns dos exemplos que armazenam dados neles de acordo com o tipo de dados primitivo especificado. Você pode usar esses contêineres importando seus respectivos cabeçalhos no arquivo C ++.
Ao inicializar a variável do contêiner, você precisa mencionar os dados primitivos, como int , char , string dentro dos <> colchetes.
Vamos explorar alguns desses contêineres em mais detalhes:
Vetor
Os vetores são matrizes dinâmicas redimensionáveis e flexíveis de se trabalhar. Quando você insere ou exclui um elemento do vetor, ele ajusta automaticamente o tamanho do vetor. Isso é semelhante à estrutura de dados ArrayList em Java.
Sintaxe:
#include <vector>
vector<data_type> variable_name;
Aqui estão alguns métodos de vetor importantes:
- push_back (valor) : este método anexa os dados ao vetor.
- pop_back () : Este método remove o último elemento do vetor.
- insert (index, value) : Este método insere novos elementos antes do elemento na posição especificada.
- size () : Este método retorna o tamanho do vetor.
- empty () : Este método verifica se o vetor está vazio ou não.
- front () : Este método retorna o primeiro valor do vetor.
- back () : o método back retorna o último valor do vetor.
- at (índice) : Este método retorna o valor na posição especificada.
- erase (índice) : O método erase remove elementos do índice fornecido.
- clear () : Este método limpa todos os itens do vetor.
vector < int > v = { 23, 12, 56, 10 };
v.push_back(5);
v.push_back(25);
v.pop_back();
auto i = v.insert(v.begin() + 1, 7);
cout << "The size of the given vector " << v.size() << endl;
if (v.empty()) {
cout << "Vector is empty" << endl;
} else {
cout << "Vector is not empty" << endl;
}
cout << "Element at the first position is " << v.front() << endl;
cout << "Element at the last position is " << v.back() << endl;
cout << "Element at the given position is " << v.at(4) << endl;
v.erase(v.begin() + 1);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
Resultado:
The size of the given vector 6
Vector is not empty
Element at the first position is 23
Element at the last position is 5
Element at the given position is 10
23 12 56 10 5
Fila
Na estrutura de dados da fila, os elementos são inseridos por trás e excluídos pela frente. Portanto, segue a abordagem FIFO ("primeiro a entrar, primeiro a sair").
Sintaxe:
#include <queue>
queue<data_type> variable_name;
Aqui estão alguns métodos de fila importantes:
- push (valor ): Este método adiciona elementos à fila.
- pop () : este método exclui o primeiro elemento da fila.
- size () : Este método retorna o tamanho da fila.
- front () : Este método retorna o primeiro elemento da fila.
- back () : este método retorna o último elemento da fila.
queue < int > q;
q.push(30);
q.push(40);
q.push(50);
q.push(60);
q.push(70);
cout << "The first element is " << q.front() << endl;
cout << "The last element is " << q.back() << endl;
cout << "The size of queue is " << q.size() << endl;
q.pop();
cout << "Printing all the elements of the Queue" << endl;
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}
Resultado:
The first element is 30
The last element is 70
The size of the queue is 5
Printing all the elements of the Queue
40 50 60 70
Pilha
Os contêineres de pilha operam no método LIFO. LIFO significa "último a entrar, primeiro a sair". Os dados são enviados e retirados da mesma extremidade.
Sintaxe:
#include <stack>
stack<data_type> variable_name;
Aqui estão alguns métodos de pilha importantes:
- push (valor ): este método coloca o elemento na pilha.
- pop () : este método exclui o elemento do topo da pilha.
- top () : Este método retorna o valor do último elemento inserido na pilha.
- size () : Este método retorna o tamanho da pilha.
- empty () : Este método verifica se a pilha está vazia ou não.
stack < int > s;
s.push(30);
s.push(40);
s.push(50);
s.push(60);
cout << "The top of the stack contains " << s.top() << endl;
s.pop();
cout << "The top of the stack after performing pop operation: " << s.top() << endl;
cout << "Printing all elements of the stack" << endl;
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}
Resultado:
The top of the stack contains 60
The top of the stack after performing pop operation: 50
Printing all elements of the stack
50 40 30
Definir
Os contêineres de conjunto são usados para manter valores únicos, e o valor do elemento não pode ser alterado depois de inserido no conjunto. Todos os elementos do conjunto são armazenados de forma ordenada. O contêiner definido é semelhante à estrutura de dados definida em Python .
Sintaxe:
#include <set>
set<data_type> variable_name;
Aqui estão alguns métodos de definição importantes:
- insert (value) : Este método insere elementos no conjunto.
- begin () : Este método retorna o iterador para o primeiro elemento do conjunto.
- end () : Este método retorna o iterador para o último elemento do conjunto.
- size () : Este método retorna o tamanho do conjunto.
- empty () : Este método verifica se o conjunto está vazio ou não.
- find (value) : este método retorna o iterador para o elemento passado no parâmetro. Se o elemento não for encontrado, esta função retorna o iterador ao final do conjunto.
- apagar (valor) : Este método excluiu o elemento especificado do conjunto.
set < int > s;
s.insert(20);
s.insert(30);
s.insert(40);
s.insert(50);
s.insert(60);
s.insert(60);
s.insert(60);
auto i = s.begin();
cout << "Element at the first position " << * i << endl;
cout << "The size of the set " << s.size() << endl;
s.find(20) != s.end() ? cout << "Element found" << endl : cout << "Element not found" << endl;
s.erase(30);
cout << "Printing all the elements" << endl;
for (auto i = s.begin(); i != s.end(); i++) {
cout << * i << " ";
}
Resultado:
Element at the first position 20
The size of the set 5
Element found
Printing all the elements
20 40 50 60
C ++ não precisa ser difícil
Assim como qualquer outra habilidade, a prática é essencial para tirar o máximo proveito do STL. Esses contêineres e algoritmos podem ajudar você a economizar muito tempo e são fáceis de usar. Comece praticando os exemplos mostrados acima e, eventualmente, começará a usá-los em seus próprios projetos também.
No entanto, se esta é a primeira vez que está aprendendo C ++, comece aprendendo o básico antes de continuar a entender o STL.