web-dev-qa-db-fra.com

Comment obtenir un élément min ou max dans un vecteur de structures en c ++, basé sur un champ de la structure?

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

14
user2381422
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;});
8
Armen Tsirunyan

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;
    });

Voici un exemple live .

17
Andy Prowl

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

12
juanchopanza

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;
}
3
Dan

Utilisez std::min/std::max/std::minmax _element avec le comparateur. http://fr.cppreference.com/w/cpp/algorithm/min_element

1
ForEveR