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

C++20:使用std::ranges按结构体成员变量排序结构体向量

嘿,用C++20的std::ranges来给你的结构体向量按x成员排序超简单的!我给你捋清楚几种实用的用法:

基础升序排序

首先要确保包含必要的头文件:<vector>、<ranges>和<algorithm>。然后直接用std::ranges::sort,利用它的**投影(projection)**特性,就能轻松指定按x成员排序,不用写繁琐的lambda比较函数:

#include <vector>
#include <ranges>
#include <algorithm>
#include <iostream>

struct MyStruct { int x; };

int main() {
    std::vector<MyStruct> myStructs;
    int n = 10;
    for(auto i = 0; i < n; i++) {
        myStructs.push_back(MyStruct{.x = n - i});
    }

    // 按x升序排序:第三个参数是投影,指定用MyStruct的x成员作为排序依据
    std::ranges::sort(myStructs, {}, &MyStruct::x);

    // 验证排序结果
    for(const auto& s : myStructs) {
        std::cout << s.x << " ";
    }
    // 输出:1 2 3 4 5 6 7 8 9 10
}

这里的&MyStruct::x就是投影,它告诉排序算法:“把每个MyStruct元素映射到它的x成员,然后基于这个值排序”。默认的比较器是升序(std::ranges::less{}),所以排序后向量里的x会从小到大排列。

降序排序

如果想要按x降序排列,只需要给std::ranges::sort传入第二个参数std::ranges::greater{}作为比较器即可:

// 按x降序排序
std::ranges::sort(myStructs, std::ranges::greater{}, &MyStruct::x);

// 验证降序结果
std::cout << "\n";
for(const auto& s : myStructs) {
    std::cout << s.x << " ";
}
// 输出:10 9 8 7 6 5 4 3 2 1

灵活的Lambda写法

如果你后续需要扩展更复杂的投影逻辑(比如对x做绝对值处理、类型转换等),也可以用Lambda代替成员指针,效果完全一致:

std::ranges::sort(myStructs, {}, [](const MyStruct& s) {
    return s.x;
    // 比如可以改成 return std::abs(s.x); 来按x的绝对值排序
});

内容的提问来源于stack exchange,提问作者Inyoung Kim 김인영

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:02:44