sorting d’un vecteur de structs

J’ai un vector info où les data sont définies comme suit:

 struct data{ ssortingng word; int number; }; 

Je dois sortinger les info en fonction de la longueur des chaînes de mots. Existe-t-il un moyen simple et rapide de le faire?

Utilisez une fonction de comparaison:

 bool compareByLength(const data &a, const data &b) { return a.word.size() < b.word.size(); } 

puis utilisez std::sort dans l'en-tête #include :

 std::sort(info.begin(), info.end(), compareByLength); 

Faites simplement une fonction de comparaison / foncteur:

 bool my_cmp(const data& a, const data& b) { // smallest comes first return a.word.size() < b.word.size(); } std::sort(info.begin(), info.end(), my_cmp); 

Ou fournissez un bool operator<(const data& a) const dans votre classe de data :

 struct data { ssortingng word; int number; bool operator<(const data& a) const { return word.size() < a.word.size(); } }; 

ou non-membre comme Fred a dit:

 struct data { ssortingng word; int number; }; bool operator<(const data& a, const data& b) { return a.word.size() < b.word.size(); } 

et appelez simplement std::sort() :

 std::sort(info.begin(), info.end()); 

Oui: vous pouvez sortinger en utilisant une fonction de comparaison personnalisée:

 std::sort(info.begin(), info.end(), my_custom_comparison); 

my_custom_comparison doit être une fonction ou une classe avec un operator() surcharge operator() (un foncteur) qui prend deux objects de data et renvoie une valeur bool indiquant si le premier est ordonné avant le second ( first < second , first < second ). Vous pouvez également surcharger operator< pour vos data type de classe; operator< est le std::sort par défaut utilisé par std::sort .

Quoi qu’il en soit, la fonction de comparaison doit donner un ordre très faible aux éléments.

Comme d’autres l’ont mentionné, vous pouvez utiliser une fonction de comparaison, mais vous pouvez également surcharger l’opérateur less fonctionnera également:

 struct data { ssortingng word; int number; bool operator < (const data& rhs) const { return word.size() < rhs.word.size(); } }; 

Alors c'est juste:

 std::sort(info.begin(), info.end()); 

modifier

Comme James McNellis l'a souligné, le sort n'utilise pas le foncteur less par défaut. Cependant, le rest de la déclaration indiquant que le foncteur less fonctionnera aussi est toujours correct, ce qui signifie que si vous voulez placer des struct data dans un std::map ou std::set cela fonctionnera quand même, mais les autres réponses qui fournissent une fonction de comparaison nécessiteraient un code supplémentaire pour travailler avec l'une ou l'autre.