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

C++自定义类型vector中查找并保存重复元素方案咨询

获取自定义类型vector中的重复元素解决方案

嘿,我来给你几个实用的思路和实现方案,帮你搞定这个重复元素提取的问题~

核心思路梳理

因为你已经把vector排序完成了,这可是个绝佳的优化点,先给你两个针对性的方案:

方案1:利用排序后的相邻元素特性(高效)

排序后相同元素会连续排列,我们只需要一次遍历就能定位重复项,还能避免重复添加同一个重复元素(比如连续三个相同的,只存一次)。

方案2:哈希表统计频次(通用)

不管vector有没有排序都能用,通过统计每个元素的出现次数,筛选出频次大于1的元素,适合不想依赖排序场景的情况。


具体代码实现

首先要确保你的Agressor类已经重载了必要的运算符(排序需要<,比较相等需要==),如果还没写,先补充:

// 在Agressor类的public区域添加
bool operator==(const Agressor& other) const {
    // 根据你的类成员实现相等判断,比如如果有string类型的id成员:
    return this->id == other.id;
}

bool operator<(const Agressor& other) const {
    // 定义排序规则,比如按id字典序排序:
    return this->id < other.id;
}

方案1:排序后遍历实现

#include <vector>
#include <algorithm>

vector<Agressor> getDuplicates(vector<Agressor>& sortedAgressors) {
    vector<Agressor> duplicates;
    
    // 元素数量不足2,直接返回空
    if (sortedAgressors.size() < 2) {
        return duplicates;
    }
    
    for (size_t i = 0; i < sortedAgressors.size() - 1; ++i) {
        // 找到相邻相等的元素
        if (sortedAgressors[i] == sortedAgressors[i+1]) {
            // 避免重复添加同一个重复项(比如连续三个相同元素只存一次)
            if (duplicates.empty() || duplicates.back() != sortedAgressors[i]) {
                duplicates.push_back(sortedAgressors[i]);
            }
        }
    }
    
    return duplicates;
}

使用时直接传入你已经排序好的vector即可:

// 假设你已经完成了vector的填充和排序
vector<Agressor> myAgressors = ...; // 从stdin填充的内容
sort(myAgressors.begin(), myAgressors.end());
vector<Agressor> dupes = getDuplicates(myAgressors);

方案2:哈希表统计实现

如果用unordered_map需要给Agressor提供哈希函数,如果你嫌麻烦,换成std::map也可以(只需要<运算符):

#include <unordered_map>
// 如果用map的话,替换成#include <map>

vector<Agressor> getDuplicatesWithHash(const vector<Agressor>& agressors) {
    vector<Agressor> duplicates;
    // 用map的话改成map<Agressor, int> countMap;
    unordered_map<Agressor, int> countMap;
    
    // 统计每个元素的出现次数
    for (const auto& ag : agressors) {
        countMap[ag]++;
    }
    
    // 筛选出出现次数大于1的元素
    for (const auto& entry : countMap) {
        if (entry.second > 1) {
            duplicates.push_back(entry.first);
        }
    }
    
    return duplicates;
}

如果使用unordered_map,需要为Agressor定义哈希函数,比如在类外添加:

namespace std {
    template<> struct hash<Agressor> {
        size_t operator()(const Agressor& ag) const {
            // 基于类的成员生成哈希值,比如用string的哈希:
            return hash<string>()(ag.id); // 假设id是Agressor的string成员
        }
    };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:41:25