我有一个自定义对象 std::vector 的指针向量。对象有一个索引,一个编号和一个时间戳(对象创建的时间)。时间戳是唯一的,编号是唯一的。
我有一个自定义对象的指针向量 std::vector<MyObject*>
。该对象具有索引、编号和时间戳(对象创建时间)。时间戳是唯一的,编号可以是 -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<MyObject*> 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 <iostream>
#include <vector>
#include <algorithm>
#include <string>
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<MyObject*> 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 << "ID\tNumber\tTimestamp" << std::endl;
for (auto const & object: myObjects) {
std::cout << std::to_string(object->id) << "\t" << std::to_string(object->number) << "\t"
<< std::to_string(object->timestamp) << std::endl;
}
return 0;
}
编辑 2我必须补充一点,实际上,没有用户真正关心排序:我发布了我在公司使用的应用程序的几个版本(我的问题是真实业务案例的简化版本),没有人抱怨。我只是试图以最优雅的方式解决“难题”。
c++,自定义对象的排序:比较函数的要求
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!