J'ai un vector<data> info
où data
est défini comme suit :
struct data{
string word;
int number;
};
J'ai besoin de trier info
par la longueur des chaînes de mots. Existe-t-il un moyen simple et rapide de le faire ?
J'ai un vector<data> info
où data
est défini comme suit :
struct data{
string word;
int number;
};
J'ai besoin de trier info
par 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();
}
et ensuite utiliser std::sort
dans l'en-tête #include <algorithm>
:
std::sort(info.begin(), info.end(), compareByLength);
Il suffit de créer une fonction/foncteur de comparaison :
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 fournir un bool operator<(const data& a) const
dans votre data
classe :
struct data {
string word;
int number;
bool operator<(const data& a) const
{
return word.size() < a.word.size();
}
};
ou non-membre comme l'a dit Fred :
struct data {
string word;
int number;
};
bool operator<(const data& a, const data& b)
{
return a.word.size() < b.word.size();
}
et appeler simplement std::sort()
:
std::sort(info.begin(), info.end());
Oui : vous pouvez trier 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 une fonction operator()
une surcharge (un foncteur) qui prend deux data
et renvoie un bool
indiquant si 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 l'ordre par défaut utilisé par std::sort
.
Quoi qu'il en soit, la fonction de comparaison doit donner une valeur ordre strict et faible des éléments.
Comme d'autres l'ont mentionné, vous pourriez utiliser une fonction de comparaison, mais vous pouvez également surcharger l'opérateur < et la fonction par défaut less<T>
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 l'a souligné James McNellis, sort
n'utilise pas réellement le less<T>
par défaut. Cependant, le reste de la déclaration selon laquelle le less<T>
fonctionnera aussi bien est toujours correct, ce qui signifie que si vous vouliez mettre struct data
dans un std::map
o 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.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.