std::set_symmetric_difference要求两输入区间均按同一比较器严格升序排列,否则静默错算;它按元素频次差|ma−mb|输出,不自动排序或扩容目标容器,须预分配空间或用back_inserter。

std::set_symmetric_difference 要求输入必须已排序
它不做排序,只做归并式扫描;传入乱序数据会导致结果错误且不可预测,不是报错而是静默错算。
- 哪怕只有一侧未排序(比如
std::vector没调std::sort),输出就可能漏元素或重复 -
std::set和std::multiset可直接用,因为底层有序;但std::unordered_set不能直接传迭代器进去 - 若用
std::vector,务必在调用前分别对两端调用std::sort,别只排一个
输出容器必须预先分配足够空间或用 back_inserter
该函数不自动扩容目标容器,返回的是“写入结束位置”的迭代器,不是新容器。
- 用
std::vector接收时,常见错误是声明空vector后直接传vec.begin()—— 这会越界写入 - 安全做法是:用
std::back_inserter(result),或先result.resize(a.size() + b.size()),再用result.begin() - 如果 resize 了,最后得用返回的迭代器做
result.erase(it, result.end())截断多余部分
处理重复元素的规则是 |m − n| 次复制
对 std::multiset 或含重复的 vector,它不是去重后算对称差,而是按频次差保留元素。
- 值
x在第一序列出现 3 次、第二序列出现 1 次 → 输出 2 个x(全来自第一序列) - 若第一序列有 2 个
x,第二序列有 5 个 → 输出 3 个x(全来自第二序列) - 这个行为和数学定义一致,但容易误以为“只要存在就只留一个”,实际不是
自定义比较器必须两边一致
如果你传了第 5 个参数(比如 std::greater<int>()</int>),那两个输入区间必须按同一规则排好序。
立即学习“C++免费学习笔记(深入)”;
- 一边升序、一边降序,哪怕内容相同,
std::set_symmetric_difference也会当它们完全不重叠来处理 - 用自定义类型时,确保
operator<或比较器逻辑在两段数据中语义统一 - 调试时可先用
std::is_sorted(first, last, comp)分别验证两端是否满足传入的比较器


















