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;
}