Поиск элемента в векторе по заданному правилу

183
23 сентября 2018, 06:10

Есть массив структур

struct CMyData
{
    int count;
    int w;
    int h;
};
CMyData myArray[100];

Есть вектор содержащий несколько индексов этого массива:

std::vector<int> indeces;

Необходимо найти итератор/индекс на элемент массива myArray в котором count максимально и в случае, если таких элементов несколько, то тот элемент, у которого (w*h) минимально.

Хотелось бы это сделать через stl и лямбада-функции

Answer 1

Не очень понял для чего в этой задаче нужен indeces, поэтому предлагаю решение без него.

auto it = std::max_element(std::begin(myArray), std::end(myArray), 
                     [](const auto& l, const auto& r) 
                     {
                         if (l.count != r.count) 
                             return l.count < r.count;
                         else
                             return l.w * l.h > r.w * r.h;
                     });
std::cout << std::distance(std::begin(myArray), it) << '\n';

Если indeces задают некое подмножество индексов, которые нужно рассматривать, а остальные игнорировать, то код может быть таким:

auto it = std::max_element(std::begin(indeces), std::end(indeces), 
                 [](int ln, int rn) 
                 {
                     const CMyData& l = myArray[ln];
                     const CMyData& r = myArray[rn];
                     if (l.count != r.count) 
                         return l.count < r.count;
                     else
                         return l.w * l.h > r.w * r.h;
                 });
std::cout << *it << '\n';    
Answer 2

спасибо alexolut за ответ

несколько переделал код для своей цели

std::vector<int>::iterator it = std::max_element(indeces.begin(), indeces.end(), [myArray](const int id1, const int id2) {
    if (myArray[id1].count != myArray[id2].count)
        return myArray[id1].count < myArray[id2].count;
    return (myArray[id1].w * myArray[id1].h) > (myArray[id2].w * myArray[id2].h);
});
READ ALSO
Утечка памяти (GDI+)

Утечка памяти (GDI+)

Почему происходит утечка памяти?

191
Как добавить флаг -std=c++17 или -std=gnu++17

Как добавить флаг -std=c++17 или -std=gnu++17

Пишу программу на C++ в Linux в среде NetBeansIDEХочу использовать #include <fillesystem>, чтобы ее использовать нужно добавить флаг -std=c++17 или -std=gnu++17

225
Отображение в cout уникальных рандомных чисел

Отображение в cout уникальных рандомных чисел

Пробовал отсеивать через if, но не получилосьПоможете реализовать?

196
Реализация факториала через класс [закрыт]

Реализация факториала через класс [закрыт]

Не понимаю, почему не работает - выдает ошибку

178