Как получить минимальный или максимальный элемент в векторе структур в С++, на основе некоторого поля в структуре?
Как получить минимальный или максимальный элемент в векторе структур в С++, на основе некоторого поля в структуре?
Например:
struct Size {
int width, height;
};
vector<Size> sizes;
И теперь я хочу решить это по ширине и создать для этого новый вектор,
а затем сортировать по высоте и создать для этого новый вектор.
Спасибо
Ответы
Ответ 1
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;});
Ответ 2
В С++ 11 вы можете использовать стандартную функцию std::minmax_element()
, которая (учитывая пару итераторов) и, возможно, пользовательскую компаратор (который позволит вам определить поле, на котором основано упорядочение), вернет вам итератор до минимума и итератор к максимальному элементу, упакованному в std::pair
.
Итак, например:
#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;
});
Вот живой пример.
Ответ 3
Вы можете использовать std:: min_element и std::max_element
с подходящим функтором:
bool cmp(const Size& lhs, const Size& rhs)
{
return lhs.width < rhs.width;
}
затем
auto min_it = std::min_element(sizes.begin(), sizes.end(), cmp);
auto max_it = std::max_element(sizes.begin(), sizes.end(), cmp);
В С++ 11 вы можете заменить cmp
на лямбда-выражение.
См. также: std::minmax_element
Ответ 4
Решение с использованием std:: minmax_element с выражением лямбда:
#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;
}
Ответ 5
Используйте std::min/std::max/std::minmax _element
с компаратором.
http://en.cppreference.com/w/cpp/algorithm/min_element