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
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.