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.
asked May 27, 2013 at 11:44
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 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
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 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
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
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; }