如何在C++中实现vector按重复元素优先的定制排序?
实现std::vector的定制排序逻辑
没问题,我来帮你搞定这个定制排序的需求。咱们先把规则再明确一遍,确保没理解错:
- 第一优先级:出现次数越多的元素越靠前
- 第二优先级:如果两个元素出现次数相同,数值更大的元素越靠前
- 本质上所有元素最终的排序逻辑就是:先按出现次数降序,次数相同则按数值降序
实现步骤
要实现这个逻辑,我们分两步走:
- 先统计每个元素在vector中的出现次数
- 自定义排序规则,传给
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
相关产品推荐
相关产品推荐

