You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:06:03