У меня есть вектор указателя пользовательского объекта 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
C++, сортировка пользовательского объекта: требования к функции сравнения ⇐ C++
Программы на C++. Форум разработчиков
1714571402
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
Подробнее здесь: [url]https://stackoverflow.com/questions/78413245/c-sorting-of-custom-object-requirements-of-the-comparison-function[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия