C++如何对vector升序排序并将零元素移至末尾
问题原因
你写的自定义比较器不符合std::sort要求的严格弱序规则,属于未定义行为,因此排序后元素顺序不会发生预期变化。原有逻辑return a < b && a>0;的问题在于:当a为0时无论b是什么都会返回false,当b为0时非0的a也不可能满足a < 0,最终sort会判定所有元素优先级相等,不会调整顺序。另外注意你示例代码中vector初始化列表里的分号是语法错误,实际编写时需要替换为逗号。
修复方案
你的排序需求可以拆解为两个优先级规则:
- 所有非0元素优先级高于0元素,全部排在0前面
- 同优先级的元素按升序从小到大排列
对应的正确比较器实现如下:
std::sort(vec.begin(), vec.end(), [](int a, int b) { // 优先处理0元素的排序优先级 if (a == 0 && b != 0) return false; if (a != 0 && b == 0) return true; // 非0元素或都为0时按升序比较 return a < b; });
完整测试代码
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec {3,0,1,0,5}; std::vector<int> vec1 {3,2,1,7,5}; auto custom_sort = [](std::vector<int>& v) { std::sort(v.begin(), v.end(), [](int a, int b) { if (a == 0 && b != 0) return false; if (a != 0 && b == 0) return true; return a < b; }); }; custom_sort(vec); custom_sort(vec1); // 输出vec std::cout << "vec: "; for (int num : vec) std::cout << num << " "; std::cout << std::endl; // 输出vec1 std::cout << "vec1: "; for (int num : vec1) std::cout << num << " "; std::cout << std::endl; return 0; }
运行后输出结果和你预期完全一致:
vec: 1 3 5 0 0 vec1: 1 2 3 5 7
内容的提问来源于stack exchange,提问作者yendang9423082
相关产品推荐
相关产品推荐

