У меня есть список из 10 элементов. Я хотел бы сортировать их определенным образом.
Например, элементы: A1, B, C1, A2, A3, F, G, C2, H, A4
Правила
- C всегда должен быть раньше A
- B всегда должен появиться после A
- Все остальные элементы должны сохранять свой порядок.
Итак, после сортировки список должен быть в этом порядке C1 C2 A1 A2 A3 F G H A4 B
Я пытаюсь использовать метод С++ std::stable_sort()
для достижения этого. В моей программе все элементы представляют собой экземпляр структуры "SItem", которая получила тип "тип" для идентификации своей категории (A, B и т.д.). Моя функция сравнения выглядит так:
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;
}
Из моего понимания stable_sort
требуется, чтобы функция сравнения выполняла "строгий слабый порядок". Очевидно, что мой метод не соответствует этому, поэтому я не могу использовать stable_sort. Доступен ли их алгоритм сортировки для достижения такого рода заказов?
Полный код
#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;
}