web-dev-qa-db-fra.com

trier un vecteur de structures

J'ai un vector<data> infodata 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?

51
calccrypto

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);
74
Oliver Charlesworth

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());
33
Murilo Vasconcelos

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.

6
James McNellis

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

1
user470379