You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:33:16