J'ai une liste de 10 articles. Je voudrais les trier d'une manière particulière.
Par exemple, les éléments sont A1, B, C1, A2, A3, F, G, C2, H, A4.
Les règles sont les suivantes
- C doit toujours passer avant A
- B doit toujours venir après A
- Tous les autres éléments doivent conserver leur ordre.
Après le tri, la liste devrait donc se présenter dans l'ordre suivant C1 C2 A1 A2 A3 F G H A4 B
J'essaie d'utiliser C++ std::stable_sort()
pour y parvenir. Dans mon programme, tous les éléments sont des instances d'une structure "SItem" qui possède un membre "type" pour indiquer sa catégorie (A, B, etc.). Ma fonction de comparaison ressemble à ceci
bool CompareItems(SItem const& item1, SItem const& item2)
{
if (item1.type == A && item2.type == C)
return false;
if (item1.type == B && item2.type == A)
return false;
return true;
}
D'après ce que j'ai compris de stable_sort
Il exige que la fonction de comparaison suive un "ordre faible strict". De toute évidence, ma méthode ne respecte pas cette exigence, et je ne peux donc pas utiliser le stable_sort. Existe-t-il un algorithme de tri permettant d'obtenir ce type d'ordre ?
Code complet
#include <list>
#include <algorithm>
#include <iostream>
enum ItemType
{
A, B, C, D, E, F, G, H,
};
struct SItem
{
SItem(ItemType t, int i) {
type = t;
index = i;
}
ItemType type;
int index;
};
//do not follow strict week ordering
bool CompareItems(SItem const& item1, SItem const& item2)
{
if (item1.type == A && item2.type == C)
return false;
if (item1.type == B && item2.type == A)
return false;
return true;
}
int main()
{
std::list<SItem> lstItems = { {A, 1}, {B, 1}, {C, 1}, {A, 2}, {A, 3}, {F, 1}, {G, 1}, {C, 2}, {H, 1}, {A, 4} };
std::stable_sort(lstItems.begin(), lstItems.end(), CompareItems);
return 0;
}