如何用C++标准库对结构体集合的单个成员变量排序?
问题描述
现有如下结构体及对应的std::vector:
struct SimpleStruct { int a; int b; int c; }; std::vector<SimpleStruct> vs;
需求:按成员a对结构体集合排序,同时保持相同a值的结构体中b和c的相对位置不变(即稳定排序)。示例如下:
排序前:
{1, 10, 11}, {5, 100, 111}, {3, 1000, 1111}
排序后:
{1, 10, 11}, {3, 1000, 1111}, {5, 100, 111} // 按a升序排列,且原结构体的相对位置(若a相同)保持不变
常规方案是创建包含{a值, 原索引}的辅助集合,排序后按索引覆盖原vector,但该方法效率较低。希望在不自定义排序算法的前提下,用C++20标准库实现需求,优先不使用Ranges特性。
解决方案
可以直接使用C++标准库中的std::stable_sort算法,它本身就是稳定排序,会自动保持相等元素的相对位置,完全符合需求,无需自定义排序逻辑,也不需要额外的辅助集合。
实现代码
#include <vector> #include <algorithm> struct SimpleStruct { int a; int b; int c; }; int main() { std::vector<SimpleStruct> vs = {{1, 10, 11}, {5, 100, 111}, {3, 1000, 1111}}; // 使用std::stable_sort,传入自定义比较器比较成员a std::stable_sort(vs.begin(), vs.end(), [](const SimpleStruct& lhs, const SimpleStruct& rhs) { return lhs.a < rhs.a; }); // 此时vs已按a升序稳定排序,相同a的结构体保持原相对位置 return 0; }
说明
std::stable_sort是C++标准库提供的稳定排序算法,在排序过程中会保留相等元素的原始相对顺序,正好满足“保持b和c相对位置不变”的需求(当多个结构体a值相同时,它们在原vector中的顺序会被保留)。- 该方法无需额外创建辅助容器,直接在原vector上操作,效率远高于“创建{值,索引}集合再覆盖”的方案。
- C++20中
std::stable_sort的实现已经优化,且完全符合标准,无需担心正确性和潜在错误。
内容的提问来源于stack exchange,提问作者Chuu
相关产品推荐
相关产品推荐

