假设我有一个非常简单结构的向量:
struct SimpleStruct { int a; int b; int c; }
std::vector<SimpleStruct> vs;
我希望按“a”对该结构进行排序,而“b”和“c”的位置保持不变。 本质上是围绕
a
旋转,按 a
排序,然后取消旋转。 举个例子:
before: {1, 10, 11}, { 5, 100, 111}, {3, 1000, 1111}
after: {1, 10, 11}, {3, 100, 111}, {5, 1000, 1111} //'a' is now sorted, 'b' and 'c' relative position unchanged
如果我只关心正确性并希望最大程度地减少潜在错误的数量,那么使用标准库,显而易见的解决方案是创建第二个类型为 {value, index} 的集合,按值排序,然后覆盖对应索引。
这是极其低效的,因为从概念上讲,这只是带有自定义交换的标准排序操作。
有没有一种方法可以使用标准库在 C++ 中执行此操作,而无需创建自定义排序方法?
首选 C++20,最好不使用范围。
如果我正确理解了这个问题,那么稳定排序就是正在寻找的解决方案。
#include <algorithm>
#include <vector>
struct SimpleStruct {
int a;
int b;
int c;
};
int main() {
std::vector<SimpleStruct> vs = {{1, 10, 11}, {5, 100, 111}, {3, 1000, 1111}};
std::ranges::stable_sort(vs, {}, &SimpleStruct::a);
}