一、QMap排序简介
QMap是Qt的一个关联容器,用来实现一个关联数组。
QMap提供了基于key(键)的值的查找,插入和删除操作。
QMap的底层使用红黑树(Red-Black Tree)来实现,它保证在对多次操作时,所有操作的复杂度都是 O(log n)。
二、QMap排序的三种方式
1. 按照key排序
// 准备需要排序的QMapQMap map; map[1] = "a"; map[3] = "c"; map[2] = "b"; map[4] = "d"; // 使用QMap的key进行排序 QMap sorted = QMap (std::less (), map);
这里我们通过 std::less
2. 按照value排序
// 准备需要排序的QMapQMap map; map[1] = "a"; map[3] = "c"; map[2] = "b"; map[4] = "d"; // 使用QMap的value进行排序 QList keys = map.keys(); // 获取所有的key std::sort(keys.begin(), keys.end(), [&](int a, int b){ return map.value(a) < map.value(b); }); QMap sorted; foreach(int key, keys) sorted[key] = map.value(key);
这里我们通过 std::sort() 函数来排序,其中通过 lambada 表达式来定义排序的方式。
3. 自定义排序方式
// 定义一个结构体 struct Person { QString name; int age; // 自定义小于号运算符 bool operator<(const Person& other) const { return age < other.age; } }; // 准备需要排序的QMap QMapmap; map[1] = {"Alice", 20}; map[3] = {"Bob", 25}; map[2] = {"Charlie", 18}; // 使用QMap的value进行排序 QList keys = map.keys(); std::sort(keys.begin(), keys.end(), [&](int a, int b){ return map.value(a) < map.value(b); }); QMap sorted; foreach(int key, keys) sorted[key] = map.value(key);
这里我们定义了一个自定义的结构体 Person,并重载了小于号运算符,再通过 std::sort() 进行排序。
三、QMap排序的注意事项
1. QMap只能对key进行排序
QMap只能对key进行排序,如果需要按value排序,需要通过转换成QList进行排序并重新构建一个新的QMap。
2. QMap对象内部排序
通过QMap的构造函数来排序QMap,将会创建一个新的QMap并返回,而不是直接在原始QMap中进行排序。
3. 自定义排序方式需要仔细考虑
自定义排序方式需要仔细考虑,应当在 operator< 中考虑到所有情况并返回正确的结果,避免造成程序运行的错误。