std::set 去重合并最省事,直接将两数组元素插入 std::set 实现自动排序与去重,再转回 vector 得并集;适用于元素可比较且不关心原始顺序的场景,要求元素支持 operator

用 std::set 去重合并最省事
直接把两个数组元素全塞进 std::set,它自动排序+去重,再倒回 vector 就是并集。适合元素可比较、不care原始顺序的场景。
- 注意
std::set要求元素支持比较,比如 <code>int、std::string没问题,自定义类型得重载operator - 如果数组本身很大,反复 insert 效率不如先 merge 再 unique:先
sort两数组,再用std::merge合并,最后std::unique - 示例:
std::vector<int> a = {1,2,3}, b = {3,4,5};<br>std::set<int> s(a.begin(), a.end());<br>s.insert(b.begin(), b.end());<br>std::vector<int> union_vec(s.begin(), s.end());</int></int></int>
保持原顺序且去重得用 std::unordered_set
如果并集要按“a 先出现、b 后出现”这种顺序,又得去重,就得边遍历边查哈希表。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 先遍历
a,把每个元素插入std::unordered_set并推入结果 vector;再遍历b,只推入没在 set 里见过的元素 - 别用
std::set替代 —— 它的find是 O(log n),而unordered_set::find平均 O(1),大数据量差距明显 - 记得 reserve 结果 vector 容量(比如
a.size() + b.size()),避免多次 realloc
遇到重复元素多时,std::sort + std::unique 更快
当两个数组各自内部重复多、但合起来重复少,或者你 already sorted,直接 merge + unique 比哈希更省内存、常数更低。
- 必须确保两数组都已升序,否则先各自
sort;然后std::merge(a.begin(),a.end(),b.begin(),b.end(),back_inserter(tmp)) -
tmp是合并后含重复的 vector,再用auto last = std::unique(tmp.begin(), tmp.end()),然后tmp.erase(last, tmp.end()) - 错误常见于漏掉
erase——unique只把重复元素挪到末尾,不真正删,不 erase 就会看到一堆脏数据
跨类型或自定义对象怎么处理
比如一个是 std::vector<:string></:string>,另一个是 std::vector<const char></const>,或者你有 struct Person。
- 统一转成同一类型再操作:比如都转
std::string,或写个通用 lambda 传给set的比较器 - 自定义类型务必提供
operator==和哈希函数(用unordered_set时),或严格弱序比较(用set时) - 别图省事用
memcmp或裸指针比较 —— 对象内有指针或 padding 时结果不可靠
merge,或者对未排序数组误用 std::set_union(它要求输入已排序)。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










