Как найти максимальный элемент в структуре с

How can I get the minimum or maximum element in a vector of structures in C++, based on some field in the structure?

For example:

struct Size {
    int width, height;
};
vector<Size> sizes;

And now I want to solve that based on width and create a new vector for that. And then sort based on height and create a new vector for that.

Peter Mortensen's user avatar

asked May 27, 2013 at 11:44

user2381422's user avatar

user2381422user2381422

5,57514 gold badges42 silver badges56 bronze badges

In C++11, you can use the std::minmax_element() standard function, which (given a pair of iterators) and possibly a custom comparator (that would allow you to define the field on which the ordering is based), will return you an iterator to the minimum and an iterator to the maximum element, packed in an std::pair.

So for instance:

#include <algorithm> // For std::minmax_element
#include <tuple> // For std::tie
#include <vector> // For std::vector
#include <iterator> // For global begin() and end()

std::vector<Size> sizes = { {4, 1}, {2, 3}, {1, 2} };

decltype(sizes)::iterator minEl, maxEl;
std::tie(minEl, maxEl) = std::minmax_element(begin(sizes), end(sizes),
    [] (Size const& s1, Size const& s2)
    {
        return s1.width < s2.width;
    });

Here is a live example.

answered May 27, 2013 at 11:46

Andy Prowl's user avatar

Andy ProwlAndy Prowl

123k23 gold badges385 silver badges451 bronze badges

You can use std::min_element and std::max_element with a suitable functor:

bool cmp(const Size& lhs, const Size& rhs)
{
  return lhs.width < rhs.width;
}

then

auto min_it = std::min_element(sizes.begin(), sizes.end(), cmp);
auto max_it = std::max_element(sizes.begin(), sizes.end(), cmp);

In C++11 you can replace cmp with a lambda expression.

See also: std::minmax_element

answered May 27, 2013 at 11:46

juanchopanza's user avatar

juanchopanzajuanchopanza

222k33 gold badges399 silver badges479 bronze badges

vector<Size> sizes;
...
vector<Size> sortedByWidths(sizes);
vector<Size> sortedByHeights(sizes);
sort(sortedByWidths.begin(), sortedByWidths.end(), 
    [](Size s1, Size s2) {return s1.width < s2.width;});
sort(sortedByHeights.begin(), sortedByHeights.end(), 
    [](Size s1, Size s2) {return s1.height< s2.height;});

answered May 27, 2013 at 11:49

Armen Tsirunyan's user avatar

Armen TsirunyanArmen Tsirunyan

129k59 gold badges324 silver badges434 bronze badges

1

Solution using std::minmax_element with lambda expression:

#include <iostream>
#include <vector>

struct Size {
    int width, height;
};

int main()
{
     std::vector<Size> sizes;

     sizes.push_back({4,1});
     sizes.push_back({2,3});
     sizes.push_back({1,2});

     auto minmax_widths = std::minmax_element(sizes.begin(), sizes.end(),
         [] (Size const& lhs, Size const& rhs) {return lhs.width < rhs.width;});
     auto minmax_heights = std::minmax_element(sizes.begin(), sizes.end(),
         [] (Size const& lhs, Size const& rhs) {return lhs.height < rhs.height;});

     std::cout << "Minimum (based on width): " << minmax_widths.first->width << std::endl;
     std::cout << "Maximum (based on width): " << minmax_widths.second->width << std::endl;

     std::cout << "Minimum (based on height): " << minmax_heights.first->height << std::endl;
     std::cout << "Maximum (based on height): " << minmax_heights.second->height << std::endl;
}

answered Sep 28, 2014 at 23:18

Dan's user avatar

The answer you link is about searching a vector for an element that meets a given criterion. Finding the maximum is different, because you have to consider all elements before you know the maximum element.

std::max_element lets you choose a comparison, so you can compare only for id easily:

auto max = *std::max_element(vec.begin(),
                             vec.end(),
                             [](const st& a,const st& b) { return a.id < b.id; });                 

You mentioned *max_element, hence I suppose that you are aware that it returns an iterator that you can dereference. However, be aware that if the container is empty the above will break (undefined behavior due to dereferencing the end iterator) and the safer way is:

auto it = std::max_element(vec.begin(),
                             vec.end(),
                             [](const st& a,const st& b) { return a.id < b.id; });                 
if (it == vec.end()) throw "max_element called on emtpy vector";
auto max = *it;

PS

[…] without the use of for loop?

Do not confuse using algorithms with “no loops”. The link above has a possible implementation and if you study it you will notice that it isnt magic, but just a plain loop. The advantage of the alogrithm is expressiveness and less possibilities for mistakes.

Формулировка задачи:

Создать файл содержащий сведения о результатах охоты.
Данные должны быть представлены в виде следующей структуры:
фамилия охотника;
количество добытых животных;
общий вес всех животных.
Написать программу определяющий результативного охотника – по количеству животных и по весу животных.
Каждую из функций разместить в отдельном заголовочном файле.

Как найти максимальное значение в Си для пределяющий результативного охотника – по количеству животных и по весу животных.

Код к задаче: «Как найти максимальное значение в списке структур»

textual

Листинг программы

void max_dannie(struct dannie mas[], int n, int* max_kol, int* max_ves)
{
   *max_kol = *max_ves = 0;
   for (i = 1; i < n; i++)
   {
      if (mas[i].kolizestvo > mas[*max_kol].kolizestvo)
      {
         *max_kol = i;
      }
      
      if (mas[i].ves > mas[*max_ves].ves)
      {
         *max_ves = i;
      }
   }
}

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given a Set, the task is to find the maximum and minimum element of this set in C++ STL. Examples:

    Input: set={1, 6, 15, 10, 5}
    Output: max = 15, min = 1
    
    Input: set={10, 20, 30, 40, 50, 60}
    Output: max = 60, min = 10
    • Using set.begin() and set.end() methods Approach: Elements in a set are stored in sorted order. So the minimum element of the set will reside in the first element and the maximum element in the last element. Therefore, this first and last element can be fetched with the help of set.begin() and set.end() methods respectively. Program: 

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    void printSet(set<int> my_set)

    {

        cout << "Set: ";

        for (auto i : my_set)

            cout << i << " ";

        cout << 'n';

    }

    int findMax(set<int> my_set)

    {

        int max_element;

        if (!my_set.empty())

            max_element = *(my_set.rbegin());

        return max_element;

    }

    int findMin(set<int> my_set)

    {

        int min_element;

        if (!my_set.empty())

            min_element = *my_set.begin();

        return min_element;

    }

    int main()

    {

        set<int> my_set;

        my_set.insert(1);

        my_set.insert(6);

        my_set.insert(15);

        my_set.insert(10);

        my_set.insert(5);

        printSet(my_set);

        cout << "Minimum element: "

            << findMin(my_set)

            << endl;

        cout << "Maximum element: "

            << findMax(my_set)

            << endl;

    }

    Output:

    Set: 1 5 6 10 15 
    Minimum element: 1
    Maximum element: 15

    Time Complexity: O(n)
    Auxiliary Space: O(n)

    • Using set.rbegin() and set.rend() methods Approach: Elements in a set are stored in sorted order. So the minimum element of the set will reside in the first element and the maximum element in the last element. Therefore, this first and last element can be fetched with the help of set.rend() and set.rbegin() methods respectively. Program: 

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    void printSet(set<int> my_set)

    {

        cout << "Set: ";

        for (auto i : my_set)

            cout << i << " ";

        cout << 'n';

    }

    int findMax(set<int> my_set)

    {

        int max_element;

        if (!my_set.empty())

            max_element = *my_set.rbegin();

        return max_element;

    }

    int findMin(set<int> my_set)

    {

        int min_element;

        if (!my_set.empty())

            min_element = *(--my_set.rend());

        return min_element;

    }

    int main()

    {

        set<int> my_set;

        my_set.insert(1);

        my_set.insert(6);

        my_set.insert(15);

        my_set.insert(10);

        my_set.insert(5);

        printSet(my_set);

        cout << "Minimum element: "

            << findMin(my_set)

            << endl;

        cout << "Maximum element: "

            << findMax(my_set)

            << endl;

    }

    Output:

    Set: 1 5 6 10 15 
    Minimum element: 1
    Maximum element: 15

    Time Complexity: O(n)
    Auxiliary Space: O(n)

    Time Complexity: Both the methods are of constant time complexity. In set the maximum element is stored at last so we can return the last element using rbegin() method in O(1) time. Similarly, for minimum element using begin() method in O(1) time.

    Last Updated :
    21 Mar, 2023

    Like Article

    Save Article

    Алгоритмы и представления

    Последнее обновление: 31.03.2023

    Алгоритмы представляют специальные функции, которые определены в модуле <algorithm> и выполняются над контейнерами элементов.
    Разберем наиболее распространенные.

    Минимальный и максимальный элементы

    Функции std::min_element и std::max_element возвращают минимальный и макисмальный элементы соответственно из некоторого диапазона.
    В качестве коллекции элементов может выступать контейнер или массив. Дипазон элементов задается начальным и конченым итераторами контейнера/массива.

    #include <iostream>
    #include <vector>
    #include <algorithm>
     
    int main()
    {
        std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8};
        std::cout << "Min: " << *std::min_element(begin(numbers), end(numbers)) << std::endl;
        std::cout << "Max: " << *std::max_element(begin(numbers), end(numbers)) << std::endl;
    }
    

    Здесь находим минимальный и максимальный элементы вектора numbers. В обоих случаях в качестве диапазона выступает весь контейнер – от итератора
    begin(numbers) до итератора end(numbers). Результатом каждой функции также является итератор. Потому для получения значения (максимального/минимального значения)
    применяем операцию разыменования: *std::min_element(...). Консольный вывод:

    Min: 1
    Max: 8
    

    Поскольку диапазон поиска значений представляет необязательно весь контейнер, а может быть только частью контейера, ограниченной итераторами, то мы можем найти максимальное/минимальное значения
    на каком-то определенном диапазоне, например, от 2-го до предпоследнего элемента:

    std::cout << "Min: " << *std::min_element(begin(numbers), end(numbers)) << std::endl;
    std::cout << "Max: " << *std::max_element(begin(numbers), end(numbers)) << std::endl;
    

    Также для получения мин/макс. значений можно принименять функцию std::minmax_element(), которая также используется итераторы для задания
    диапазона поиска. Но результат возвращает в виде объекта std::pair<iterator, iterator>:

    #include <iostream>
    #include <vector>
    #include <algorithm>
     
    int main()
    {
        std::vector<int> numbers { 1, 2, 3, 4, 5, 6, 7, 8};
        const auto [min, max] = std::minmax_element(begin(numbers), end(numbers));
        std::cout << "Min: " <<  *min << std::endl;
        std::cout << "Max: " << *max << std::endl;
    }
    

    Добавить комментарий