Minimum po ključu
Napisati prostu polimorfnu funkciju:
template <typename It, typename KeyFunc>
It min_by_key(It begin, It end, KeyFunc key)koja vraća iterator na element iz opsega [begin, end) za koji je vrednost funkcije key najmanja. Ako je opseg prazan, funkcija treba da vrati end.
Test
main.cpp
#include <iostream>
#include <vector>
#include <string>
namespace matf {
template <typename It, typename KeyFunc>
It min_by_key(It begin, It end, KeyFunc key)
{
// Ovde ide vaša implementacija
}
struct Student {
std::string name;
double gpa;
};
} // namespace matf
int main()
{
std::vector<int> v = { 5, 3, 8, 1, 4 };
auto min_it = matf::min_by_key(v.begin(), v.end(), [](int x) { return x; });
if (min_it != v.end()) {
std::cout << *min_it << "\n"; // Ispisuje: 1
} else {
std::cout << "Prazan opseg\n";
}
std::vector<std::string> words = { "jabuka", "banana", "kivi", "visnja" };
auto shortest_it = matf::min_by_key(words.begin(), words.end(),
[](const std::string& s) { return s.size(); });
if (shortest_it != words.end()) {
std::cout << *shortest_it << "\n"; // Ispisuje: kivi
} else {
std::cout << "Prazan opseg\n";
}
std::vector<matf::Student> students = {
{ "Alisa", 7.5 },
{ "Boban", 8.8 },
{ "Cica", 7.2 }
};
auto lowest_gpa_it = matf::min_by_key(students.begin(), students.end(),
[](const matf::Student& s) { return s.gpa; });
if (lowest_gpa_it != students.end()) {
std::cout << lowest_gpa_it->name << "\n"; // Ispisuje: Cica
} else {
std::cout << "Prazan opseg\n";
}
return 0;
}Rešenje
main.cpp
#include <iostream>
#include <vector>
#include <string>
namespace matf {
template <typename It, typename KeyFunc>
It min_by_key(It begin, It end, KeyFunc key)
{
if (begin == end) {
return end;
}
It min_it = begin;
for (It it = begin; it != end; ++it) {
if (key(*it) < key(*min_it)) {
min_it = it;
}
}
return min_it;
}
struct Student {
std::string name;
double gpa;
};
} // namespace matf
int main(void)
{
std::vector<int> v = { 5, 3, 8, 1, 4 };
auto min_it = matf::min_by_key(v.begin(), v.end(), [](int x) { return x; });
if (min_it != v.end()) {
std::cout << *min_it << "\n"; // Ispisuje: 1
} else {
std::cout << "Prazan opseg\n";
}
std::vector<std::string> words = { "jabuka", "banana", "kivi", "visnja" };
auto shortest_it = matf::min_by_key(words.begin(), words.end(),
[](const std::string& s) { return s.size(); });
if (shortest_it != words.end()) {
std::cout << *shortest_it << "\n"; // Ispisuje: kivi
} else {
std::cout << "Prazan opseg\n";
}
std::vector<matf::Student> students = {
{ "Alisa", 7.5 },
{ "Boban", 8.8 },
{ "Cica", 7.2 }
};
auto lowest_gpa_it = matf::min_by_key(students.begin(), students.end(),
[](const matf::Student& s) { return s.gpa; });
if (lowest_gpa_it != students.end()) {
std::cout << lowest_gpa_it->name << "\n"; // Ispisuje: Cica
} else {
std::cout << "Prazan opseg\n";
}
return 0;
}