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 김인영
相关产品推荐
相关产品推荐

