有没有一种有效的方法来对 C++ 中结构体集合中的单个成员变量进行排序?

问题描述 投票:0回答:1

假设我有一个非常简单结构的向量:

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,最好不使用范围。

c++ sorting c++20
1个回答
0
投票

如果我正确理解了这个问题,那么稳定排序就是正在寻找的解决方案。

#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);
}

https://godbolt.org/z/rebdnEMz5

© www.soinside.com 2019 - 2024. All rights reserved.