Comment obtenir un élément min ou max dans un vecteur de structures en c ++, basé sur un champ de la structure?
Par exemple:
struct Size {
int width, height;
};
vector<Size> sizes;
Et maintenant, je veux résoudre ce problème en fonction de la largeur et créer un nouveau vecteur, puis trier en fonction de la hauteur et créer un nouveau vecteur.
Merci
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;});
En C++ 11, vous pouvez utiliser la fonction std::minmax_element()
standard, qui (avec deux itérateurs) et éventuellement un comparateur personnalisé (qui vous permettrait de définir le champ sur lequel est basé l'ordre), vous êtes un itérateur au minimum et un itérateur au maximum, contenu dans un std::pair
.
Donc par exemple:
#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;
});
Vous pouvez utiliser std :: min_element et std::max_element
avec un foncteur approprié:
bool cmp(const Size& lhs, const Size& rhs)
{
return lhs.width < rhs.width;
}
puis
auto min_it = std::min_element(sizes.begin(), sizes.end(), cmp);
auto max_it = std::max_element(sizes.begin(), sizes.end(), cmp);
En C++ 11, vous pouvez remplacer cmp
par une expression lambda.
Voir aussi : std::minmax_element
Solution utilisant std :: minmax_element avec l'expression lambda:
#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;
}
Utilisez std::min/std::max/std::minmax _element
avec le comparateur. http://fr.cppreference.com/w/cpp/algorithm/min_element