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
相关产品推荐
相关产品推荐

