(5) Implemente uma função template findMin que receba um vetor de qualquer tipo e seu tamanho e retorne o menor elemento.
(6) Escreva uma função genérica que recebe como parâmetro um vector de valores de qualquer tipo e retorna true se os elementos estiverem ordenados ou false, caso contrário. Na função main, faça a chamada da função para valores do tipo int, float e char.
(6) Escreva uma função genérica que recebe como parâmetro um vector de valores de qualquer tipo e retorna true se os elementos estiverem ordenados ou false, caso contrário. Na função main, faça a chamada da função para valores do tipo int, float e char.
Passo 1
Beleza, então o enunciado pede duas coisas bem de boa em C++ usando template:
- Uma função
findMin
que recebe um vetor genérico (array) e seu tamanho, e devolve o menor elemento. - Uma função
isSorted
que recebe umstd::vector
genérico e retornatrue
se ele já estiver ordenado (do menor para o maior) oufalse
caso contrário.
Conteúdo: templates em C++, laços de repetição, comparações (<
), uso destd::vector
e funções genéricas. Vamos precisar saber como declarartemplate<typename T>
, como iterar em arrays/vetores e como usar operadores de comparação.
Passo 2
Implementando
findMin
:- A ideia é simples: suponha que o primeiro elemento seja o menor (
min = vec[0]
). - Depois percorre o restante do array com um
for
. - A cada passo, compara
vec[i] < min
; se for menor, atualizamin
. - No fim, retorna
min
.
Teoria: isso é um algoritmo de complexidade, porque faz uma única varredura de todos os elementos.
Código da função:
template<typename T>
T findMin(T vec[], int size) {
T min = vec[0]; // passo 1: inicializa
for (int i = 1; i < size; ++i) { // passo 2: percorre
if (vec[i] < min) { // passo 3: compara
min = vec[i]; // passo 4: atualiza
}
}
return min; // passo 5: devolve o menor
}
template<typename T>
T findMin(T vec[], int size) {
T min = vec[0]; // passo 1: inicializa
for (int i = 1; i < size; ++i) { // passo 2: percorre
if (vec[i] < min) { // passo 3: compara
min = vec[i]; // passo 4: atualiza
}
}
return min; // passo 5: devolve o menor
}
Passo 3
Implementando
isSorted
:- Queremos checar se cada par de elementos adjacentes está em ordem crescente.
- Então usamos um
for
que começa em 1 e vai atév.size()-1
. - Em cada iteração, se
v[i] < v[i-1]
, já sabemos que não está ordenado e devolvemosfalse
. - Se passar por todo o vetor sem achar inversão, devolve
true
.
Teoria: mesmíssimo, pois para cada elemento, faz no máximo uma comparação com o anterior.
Código da função:
#include <vector>
#include <vector>
template<typename T>
bool isSorted(const std::vector<T>& v) {
for (size_t i = 1; i < v.size(); ++i) {
if (v[i] < v[i-1]) {
return false; // encontrou par fora de ordem
}
}
return true; // passou em todas as comparações
}
Passo 4
Chamando as funções no
main
:- Vamos testar
findMin
num array deint
, num defloat
e num dechar
. - E testar
isSorted
em vetores desses mesmos tipos. - Para imprimir, usamos
std::cout
. - Assim o aluno vê como o template serve pra qualquer tipo que suporte
<
.
Exemplo de
#include <iostream>
#include <vector>
main
completo:#include <iostream>
#include <vector>
// aqui entram findMin e isSorted
int main() {
int vi[] = { 5, 2, 8, 1, 9 };
float vf[] = { 3.2f, 1.1f, 4.8f, 2.0f };
char vc[] = { 'z', 'a', 'm', 'b' };
std::cout << "Menor int: " << findMin(vi, 5) << "\n";
std::cout << "Menor float: " << findMin(vf, 4) << "\n";
std::cout << "Menor char: " << findMin(vc, 4) << "\n\n";
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<float> v2 = {1.0f, 2.5f, 2.5f};
std::vector<char> v3 = {'a', 'b', 'c'};
std::cout << "v1 ordenado? " << (isSorted(v1) ? "true" : "false") << "\n";
std::cout << "v2 ordenado? " << (isSorted(v2) ? "true" : "false") << "\n";
std::cout << "v3 ordenado? " << (isSorted(v3) ? "true" : "false") << "\n";
return 0;
}
Resposta
#include <iostream>
#include <vector>
#include <vector>
// Passo 2: findMin
template<typename T>
T findMin(T vec[], int size) {
T min = vec[0];
for (int i = 1; i < size; ++i) {
if (vec[i] < min) {
min = vec[i];
}
}
return min;
}
// Passo 3: isSorted
template<typename T>
bool isSorted(const std::vector<T>& v) {
for (size_t i = 1; i < v.size(); ++i) {
if (v[i] < v[i-1]) {
return false;
}
}
return true;
}
int main() {
int vi[] = { 5, 2, 8, 1, 9 };
float vf[] = { 3.2f, 1.1f, 4.8f, 2.0f };
char vc[] = { 'z', 'a', 'm', 'b' };
std::cout << "Menor int: " << findMin(vi, 5) << "\n";
std::cout << "Menor float: " << findMin(vf, 4) << "\n";
std::cout << "Menor char: " << findMin(vc, 4) << "\n\n";
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<float> v2 = {1.0f, 2.5f, 2.5f};
std::vector<char> v3 = {'a', 'b', 'c'};
std::cout << "v1 ordenado? " << (isSorted(v1) ? "true" : "false") << "\n";
std::cout << "v2 ordenado? " << (isSorted(v2) ? "true" : "false") << "\n";
std::cout << "v3 ordenado? " << (isSorted(v3) ? "true" : "false") << "\n";
return 0;
}