J'ai un vector<data> info
où data
est défini comme:
struct data{
string Word;
int number;
};
J'ai besoin de trier info
par la longueur des chaînes Word. Existe-t-il un moyen rapide et simple 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 <algorithm>
:
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 une bool operator<(const data& a) const
dans votre classe data
:
struct data {
string Word;
int number;
bool operator<(const data& a) const
{
return Word.size() < a.Word.size();
}
};
ou non-membre comme Fred l'a dit:
struct data {
string 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 trier à l'aide d'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 une surcharge operator()
(un foncteur) qui prend deux data
objets et renvoie un bool
indiquant si le le premier est commandé avant le second (c'est-à-dire first < second
). Alternativement, vous pouvez surcharger operator<
Pour votre type de classe data
; operator<
Est la commande par défaut utilisée par std::sort
.
Dans les deux cas, la fonction de comparaison doit produire un ordre faible strict des éléments.
Comme d'autres l'ont mentionné, vous pouvez utiliser une fonction de comparaison, mais vous pouvez également surcharger l'opérateur <et la valeur par défaut less<T>
functor fonctionnera également:
struct data {
string 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é, sort
n'utilise pas réellement le less<T>
foncteur par défaut. Cependant, le reste de la déclaration selon laquelle le less<T>
functor fonctionnera également est toujours correct, ce qui signifie que si vous vouliez mettre struct data
s dans un std::map
ou std::set
cela fonctionnerait toujours, mais les autres réponses qui fournissent une fonction de comparaison auraient besoin de code supplémentaire pour fonctionner avec l'une ou l'autre.