C++, сортировка пользовательского объекта: требования к функции сравненияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C++, сортировка пользовательского объекта: требования к функции сравнения

Сообщение Anonymous »

У меня есть вектор указателя пользовательского объекта std::vector. Объект имеет индекс, номер и временную метку (время создания объекта). Временная метка уникальна, число может быть как -1 (объекту еще не присвоен номер), так и положительное значение; если номер объекта больше 0, этот номер уникален.
class MyObject {
private:
int id;
int number;
time_t timestamp;
public:
MyObject(int id, int number, time_t timestamp) : id(id), number(number), timestamp(timestamp) {}
};

Я хочу упорядочить вектор с помощью специальной функции сравнения: если два экземпляра моего объекта имеют номер, я упорядочиваю его по номеру (по убыванию), если нет, я упорядочиваю его по временной метке. (по убыванию).
Поэтому я добавил в класс MyObject следующее:
static bool compareByDescendingNumberAndTimestamp(MyObject * a, MyObject * b) {
if (a->number > 0 && b->number > 0) {
return a->number > b->number;
}
return a->timestamp > b->timestamp;
}

И, наконец, отсортируйте вектор:
std::vector myObjects;
auto object1 = new MyObject(1, 24097, 1200);
auto object2 = new MyObject(2, 24096, 1100);
auto object3 = new MyObject(3, -1, 1000);
auto object4 = new MyObject(4, -1, 900);
auto object5 = new MyObject(5, 24099, 800);
auto object6 = new MyObject(6, 24095, 850);
myObjects.push_back(object1);
myObjects.push_back(object2);
myObjects.push_back(object3);
myObjects.push_back(object4);
myObjects.push_back(object5);
myObjects.push_back(object6);
std::sort(myObjects.begin(), myObjects.end(), MyObject::compareByDescendingNumberAndTimestamp);

Я намеревался придерживаться следующего порядка:
ID Number Timestamp
5 24099 800
1 24097 1200
2 24096 1100
3 - 1000
4 - 900
6 24095 850

Но на самом деле я получил следующее:
ID Number Timestamp
1 24097 1200
2 24096 1100
3 - 1000
4 - 900
5 24099 800
6 24095 850

После некоторых исследований я нашел эту страницу. Насколько я понял, моя функция сравнения не удовлетворяет требованиям Compare. В частности, comp(a, b) не устанавливает строгое слабое отношение упорядочения.
Есть ли способ написать функцию сравнения чтобы упорядочить вектор так, как я хочу?
Примечание: я использую C++17.
Изменить:
Минимальный воспроизводимый пример (обратите внимание, что начальный порядок вектора влияет на конечный результат):
#include
#include
#include
#include

class MyObject {
public:
int id;
int number;
time_t timestamp;

MyObject(int id, int number, time_t timestamp) : id(id), number(number), timestamp(timestamp) {}

static bool compareByDescendingNumberAndTimestamp(MyObject * a, MyObject * b) {
if (a->number > 0 && b->number > 0) {
return a->number > b->number;
}
return a->timestamp > b->timestamp;
}
};

int main() {
std::vector myObjects;
auto object1 = new MyObject(1, 24097, 1200);
auto object2 = new MyObject(2, 24096, 1100);
auto object3 = new MyObject(3, -1, 1000);
auto object4 = new MyObject(4, -1, 900);
auto object5 = new MyObject(5, 24099, 800);
auto object6 = new MyObject(6, 24095, 850);
myObjects.push_back(object6);
myObjects.push_back(object5);
myObjects.push_back(object4);
myObjects.push_back(object3);
myObjects.push_back(object2);
myObjects.push_back(object1);
std::sort(myObjects.begin(), myObjects.end(), MyObject::compareByDescendingNumberAndTimestamp);

std::cout

Подробнее здесь: https://stackoverflow.com/questions/784 ... n-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»