9 votes

Trier un vecteur d'objets par un attribut de l'objet

Possiblement un doublon :
Comment utiliser std::sort avec un vecteur de structures et une fonction de comparaison ?

J'ai un objet chat (quoi ?) et un objet catSort qui trie évidemment les objets chat. Ci-dessous se trouvent les classes

class chat {
public:
    int age;
};

class catSorter {
public:
    vector< chat > cats;
    vector< chat > SortCatsByAge();
    void AddCat( chat new_chat );
};

void catSorter::AddCat(chat new_chat){
    this->cats.push_back(new_chat)
}

vector< chat > catSorter::SortCatsByAge(){
    // Trier les chats ici par âge !
}

chat tim;
tim.age = 10;

chat mark;
mark.age = 20

chat phil;
phil.age = 3;

catSorter trieuse;
trieuse->AddCat(tim);
trieuse->AddCat(mark);
trieuse->AddCat(phil);

std:: chatsTries = trieuse->SortCatsByAge();

J'ai des difficultés à trier un vecteur, comment pourrais-je faire cela ? Devrais-je simplement boucler à travers l'attribut chats et les stocker dans un vecteur temporaire puis le retourner ? Y a-t-il un moyen plus facile de le faire ?

26voto

mfontanini Points 14036

Vous devez implémenter un operator< sur la classe cat afin que les chats puissent être triés :

class cat {
public:
    int age;
    bool operator< (const cat &other) const {
        return age < other.age;
    }
};

Vous pouvez ensuite inclure l'en-tête "algorithm" et utiliser std::sort sur votre tableau :

vector< cat > catSorter::SortCatsByAge(){
   vector< cat > cats_copy = cats;
   std::sort(cats_copy.begin(), cats_copy.end());
   return cats_copy;
}

Prograide.com

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.

Powered by:

X