如何正确对double类型数组排序?现有std::sort代码无法运行
解决C-style double数组的排序问题
嘿,我来帮你搞定这个数组排序的坑!你之前的代码报错,核心问题是普通的C-style数组(就是你声明的double myArray[4]这种)没有begin()和end()成员函数——这些是std::vector这类容器才有的方法,直接用在数组上肯定会编译失败。
下面给你两种最常用的正确写法,不管升序还是降序都能轻松搞定:
方法1:手动指定数组的起始和结束指针
因为数组名会自动退化为指向第一个元素的指针,我们可以直接用它作为排序的起始位置,用数组名 + 数组长度作为结束位置(std::sort要求的是左闭右开区间[first, last),所以myArray + 4刚好指向最后一个元素的下一个位置,完全符合要求)。
完整示例代码
#include <iostream> #include <algorithm> // 必须包含这个头文件才能用std::sort int main() { double myArray[4] = {0.0, 5.0, 2.1, 99.1}; // 升序排序(默认就是升序,不用额外写比较规则) std::sort(myArray, myArray + 4); std::cout << "升序排序结果:"; for (double num : myArray) { std::cout << num << " "; } std::cout << "\n"; // 降序排序(用你写的lambda表达式作为比较规则) std::sort(myArray, myArray + 4, [](const double& a, const double& b) { return a > b; // 返回true就把a放在b前面,实现降序 }); std::cout << "降序排序结果(lambda版):"; for (double num : myArray) { std::cout << num << " "; } std::cout << "\n"; return 0; }
方法2:用全局的std::begin()和std::end()函数(C++11及以后可用)
如果你觉得手动写数组长度麻烦,或者担心数组长度修改后忘记更新sort的参数,可以用算法库提供的全局std::begin()和std::end(),它们能自动识别数组的边界,用法和vector几乎一模一样:
// 升序排序 std::sort(std::begin(myArray), std::end(myArray)); // 降序排序(同样用lambda) std::sort(std::begin(myArray), std::end(myArray), [](const double& a, const double& b) { return a > b; });
另外,降序排序还可以用标准库自带的std::greater<double>()比较器,不用自己写lambda,不过需要额外包含<functional>头文件:
#include <functional> // 降序排序(用std::greater) std::sort(std::begin(myArray), std::end(myArray), std::greater<double>());
这样写出来的代码既简洁又安全,完全适配你的数组排序需求~
内容的提问来源于stack exchange,提问作者user9591123
相关产品推荐
相关产品推荐

