Можно ли передать в компаратор C++ дополнительный аргумент?

У меня есть задача, которая требует найти минимальное значение, но в определенном диапазоне. Можно ли как-то передать дополнительные аргументы в компаратор? Или лучше не уродоваться, а сначала отсортировать вектор, чтобы все значения соответствовали диапазону, и потом найти минимальный элемент?


Ответы (3 шт):

Автор решения: Harry

Есть же min_element, зачем сортировать?

Если речь идет о диапазоне ЗНАЧЕНИЙ, то, например, так:

struct lessDion
{
    int m, M;
    lessDion(int m, int M):m(m),M(M){};
    bool operator()(int a, int b)
    {
        bool a_in = (a >= m && a <= M);
        bool b_in = (b >= m && b <= M);
        if (a_in && !b_in) return true;
        if (b_in && !a_in) return false;
        return a < b;
    }
};

int main(int argc, char * argv[])
{
    vector<int> v{1,0,5,7,12,4,-1,22};

    cout << *min_element(v.begin(),v.end(),lessDion(3,6));
}

Если о диапазоне ИНДЕКСОВ, то

cout << *min_element(next(v.begin(),3),next(v.begin(),6));
→ Ссылка
Автор решения: Eugene X
#include <iostream>
#include <climits>
#include <vector>

int minValue(const std::vector<int> & values, int min, int max, bool & found) {
    found = false;
    int last = INT_MAX;
    for (auto val: values) {
        if ((val <= max) && (val >= min)) {
            found = true;
            if (val < last) {
                last = val;
            }
        }
    }
    return last;
};

int main()
{
    std::vector<int> myVector = { 1, 2, 3, 25, 26, 27, 40, 50, 51 };
    bool found;
    int min = minValue(myVector, 26, 30, found);
    if (found) {
        std::cout << "minimal range value is: " << min << std::endl;
    } else {
        std::cout << "sorry there no value in range" << std::endl;
    }
    return 0;
}
→ Ссылка
Автор решения: AFoki Pig
Point FindMinPoint(const std::vector& collection, const Point& minX, const Point& minY)
{
auto val{ std::min_element(collection.begin(), collection.end(),
                           [&minX, &minY](const auto& p1, const auto& p2)
    {
        if(p2.x < minX.x
                || p2.x > minY.x
                || p2.y < minY.y
                || p2.y > minX.y)
        {
            return true;
        }

        Point minVal{minX.x, minY.y};

        Vector tmpVec1{p1, minVal};
        Vector tmpVec2{p2, minVal};

        return VecLength(tmpVec1()) < VecLength(tmpVec2());



    }) };

return { *val };
}

Лямбда оказалась самым удачным вариантом. Решение можно ещё оптимизировать. Знаю) Спасибо товарищу KoVadim

→ Ссылка