C++ sort使用自定义函数的一些坑

### C++使用自定义函数对多维数组或容器进行排序 在 C++ 中,`std::sort()` 函数允许通过提供一个比较函数来实现自定义排序逻辑。当处理多维数组或复杂数据结构(如 `std::vector<std::vector<T>>` 或其他嵌套容器)时,可以通过传递 lambda 表达式或其他形式的比较器来进行定制化排序。 #### 自定义排序的基本原理 为了使 `std::sort()` 支持自定义排序,需为其第三个参数指定一个二元谓词(binary predicate),该谓词接受两个待比较的对象作为输入并返回布尔值。如果第一个对象应排在第二个之前,则返回 `true`;否则返回 `false`[^2]。 #### 对二维向量 (`std::vector<std::vector<T>>`) 进行排序 假设有一个二维向量 `std::vector<std::vector<int>> matrix`,希望按照每一行的第一个元素从小到大排序: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<std::vector<int>> matrix = { {3, 4}, {1, 2}, {5, 6} }; // 使用lambda表达式作为自定义排序规则 std::sort(matrix.begin(), matrix.end(), [](const std::vector<int>& a, const std::vector<int>& b) -> bool { return a[0] < b[0]; // 按照每行的第一个元素升序排列 }); // 输出结果 for (const auto& row : matrix) { for (const int elem : row) { std::cout << elem << " "; } std::cout << "\n"; } return 0; } ``` 上述代码中,我们利用了一个捕获上下文为空的 lambda 表达式作为第三参数传入 `std::sort()`,从而实现了基于子向量首元素的排序。 #### 对固定大小的多维数组进行排序 对于固定大小的多维数组(例如 `float array[numRows][numCols]`),由于其本质上是一个连续内存块而非标准库容器,因此需要额外注意指针操作以及可能存在的不可变性问题[^5]。下面展示了一种方法,即借助适配器将原始数组转换成可迭代范围后再调用 `std::sort()`: ```cpp #include <iostream> #include <algorithm> constexpr size_t numRows = 3; constexpr size_t numCols = 8; int main() { float array[numRows][numCols] = { /* 初始化 */ }; // 定义用于比较两行的Lambda表达式 auto compareRows = [](float (*rowA)[numCols], float (*rowB)[numCols]) -> bool { return (*(rowA))[0] < (*(rowB))[0]; // 假设按第零列数值决定顺序 }; // 调整指向各行起始位置的一级指针序列 float(*rowsPtrs[])[numCols] = { &array[0], &array[1], &array[2] }; std::sort(std::begin(rowsPtrs), std::end(rowsPtrs), compareRows); // 打印重新安排后的矩阵内容... } ``` 这里的关键在于创建了一个临时数组 `rowsPtrs` 来存储各原生二维数组行地址,并针对这些间接引用执行实际排序过程[^3]^。 #### 总结注意事项 - 当涉及 STL 容器时,通常可以直接对其内部元素应用 `std::sort()` 并附加适当的形式化条件描述符。 - 如果目标是非动态分配的传统静态数组,则往往有必要先构建辅助索引列表再实施相应变换动作以免破坏原有布局约束.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值