排序算法如何对存储float、double类型的容器及区间执行排序操作?
关于C++
std::sort 排序浮点数容器的问题解答 std::sort 默认使用严格的原生小于比较运算符 operator< 完成元素排序,没有内置任何特殊的浮点数适配逻辑,排序效果完全由浮点数本身的比较规则决定。
对应你给出的示例代码:
std::vector<float> vf{2.4f, 1.05f, 1.05f, 2.39f}; std::sort( vf.begin(), vf.end() );
三个问题的具体解答如下:
- 算法是否会对两个值为1.05f的float元素进行比较?
这取决于标准库具体的排序算法实现,只要排序过程中需要判断这两个元素的先后顺序,就会触发比较。由于1.05f < 1.05f返回false,反向比较也返回false,排序算法会判定二者等价。又因为std::sort是不稳定排序,两个等价的1.05f的相对顺序在排序后不保证和原顺序一致。 - 算法内部是否会采用类似
std::fabs( 1.05f - 1.05f ) < 0.1;的近似比较逻辑?
完全不会。默认的比较逻辑是严格的浮点数原生小于运算,不会主动加入任何误差容限的判断。如果需要近似比较,你需要自定义比较器作为第三个参数传入std::sort,同时要保证自定义比较器满足严格弱序要求,否则会触发未定义行为。
额外提示:如果容器中存在NaN值,默认的浮点数比较会因为不满足严格弱序(NaN和任何值比较都返回false)导致排序行为完全未定义。 - 上述排序逻辑是否同样适用于存储double类型的容器?
完全适用。double类型的默认operator<比较规则和float一致,std::sort对double容器的处理逻辑和float没有区别,同样遵循上面提到的所有规则。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

