LINUX.ORG.RU

чем можно заменить min_element/max_element с условием выборки?

 ,


0

1

проблема в том что min_element берет по умолчанию первый элемент в качестве результата, делать remove_if а если контейнер только для чтения?

вот пример, результат 20, мне нужно «not found»

#include <utility>
#include <vector>
#include <iostream>
#include <algorithm>

int main()
{
    std::vector< std::pair<bool, int> > v = { {false, 20}, {false, 3}, {false, 11}, {false, 7}, {false, 12} };
    auto it = std::min_element(v.begin(), v.end(),
                        [](const std::pair<bool, int> & p1, const std::pair<bool, int> & p2)
    {
        if(p1.first && p2.first)
            return p1.second < p2.second;

        return p1.first;
    });

    if(it != v.end())
        std::cout << (*it).second << std::endl;
    else
        std::cout <<  "not found" << std::endl;

    return 0;
}
★★★★★

Последнее исправление: anonymous2 (всего исправлений: 1)

как минимальный элемент может быть «not found» в непустом контейнере?

fsb4000 ★★★★★
()
        if(p1.first && p2.first)

Если в списке будет один элемент {true, ...}, или будет зебра {false, }, {true, }, {false, }, {true, }, ...?

anonymous
()

Твоя лямбда-функция не является отношением порядка. Поэтому совать ее в стандартный алгоритм и ожидать стандартного поведения не стоит. Или сделай лямбду отношением порядка, или ищи свой «минимум» в несколько проходов.

nikitos ★★★
()

Так ты в начале отфильтруй по первым полям, а в остатке уже ищи минимальный элемент. Тут ренджи очень хороши как раз, с итераторами сложнее.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.