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:

  1. Algoritmos
  2. Recipientes
  3. Funções
  4. 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.

Relacionado: Uma introdução ao algoritmo de classificação de mesclagem

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

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:

  1. push_back (valor) : este método anexa os dados ao vetor.
  2. pop_back () : Este método remove o último elemento do vetor.
  3. insert (index, value) : Este método insere novos elementos antes do elemento na posição especificada.
  4. size () : Este método retorna o tamanho do vetor.
  5. empty () : Este método verifica se o vetor está vazio ou não.
  6. front () : Este método retorna o primeiro valor do vetor.
  7. back () : o método back retorna o último valor do vetor.
  8. at (índice) : Este método retorna o valor na posição especificada.
  9. erase (índice) : O método erase remove elementos do índice fornecido.
  10. 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:

  1. push (valor ): Este método adiciona elementos à fila.
  2. pop () : este método exclui o primeiro elemento da fila.
  3. size () : Este método retorna o tamanho da fila.
  4. front () : Este método retorna o primeiro elemento da fila.
  5. 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:

  1. push (valor ): este método coloca o elemento na pilha.
  2. pop () : este método exclui o elemento do topo da pilha.
  3. top () : Este método retorna o valor do último elemento inserido na pilha.
  4. size () : Este método retorna o tamanho da pilha.
  5. 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:

  1. insert (value) : Este método insere elementos no conjunto.
  2. begin () : Este método retorna o iterador para o primeiro elemento do conjunto.
  3. end () : Este método retorna o iterador para o último elemento do conjunto.
  4. size () : Este método retorna o tamanho do conjunto.
  5. empty () : Este método verifica se o conjunto está vazio ou não.
  6. 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.
  7. 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.