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

如何在C++中实现vector按重复元素优先的定制排序?

实现std::vector的定制排序逻辑

没问题,我来帮你搞定这个定制排序的需求。咱们先把规则再明确一遍,确保没理解错:

  • 第一优先级:出现次数越多的元素越靠前
  • 第二优先级:如果两个元素出现次数相同,数值更大的元素越靠前
  • 本质上所有元素最终的排序逻辑就是:先按出现次数降序,次数相同则按数值降序

实现步骤

要实现这个逻辑,我们分两步走:

  1. 先统计每个元素在vector中的出现次数
  2. 自定义排序规则,传给std::sort函数

完整代码示例

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

int main() {
    // 测试示例1
    std::vector<int> v1 = {3, 9, 7, 7, 2};
    // 测试示例2
    std::vector<int> v2 = {3, 7, 7, 7, 2};
    // 测试示例3
    std::vector<int> v3 = {7, 9, 2, 7, 9};

    // 封装通用排序逻辑
    auto customSort = [](std::vector<int>& vec) {
        // 第一步:统计元素出现次数
        std::unordered_map<int, int> countMap;
        for (int num : vec) {
            countMap[num]++;
        }

        // 第二步:按自定义规则排序
        std::sort(vec.begin(), vec.end(), [&countMap](int a, int b) {
            // 优先按出现次数降序
            if (countMap[a] != countMap[b]) {
                return countMap[a] > countMap[b];
            }
            // 次数相同则按数值降序
            return a > b;
        });
    };

    // 封装打印逻辑
    auto printResult = [](const std::vector<int>& vec) {
        for (int num : vec) {
            std::cout << num;
        }
        std::cout << std::endl;
    };

    // 执行测试
    customSort(v1);
    printResult(v1); // 输出:77932

    customSort(v2);
    printResult(v2); // 输出:77732

    customSort(v3);
    printResult(v3); // 输出:99772

    return 0;
}

代码细节说明

  • 统计次数:用std::unordered_map存储元素和对应出现次数,遍历一次vector就能完成统计,时间复杂度O(n)
  • 排序逻辑:通过lambda捕获统计好的countMap,在比较时先判断次数差异,次数相同再比较数值,完全贴合需求
  • 复用性:把排序和打印逻辑都做了封装,不管是处理新的vector还是扩展测试用例都很方便

运行这段代码,三个测试示例的输出完全符合你给出的预期结果。

内容的提问来源于stack exchange,提问作者RangerBob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:12:31