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

使用erase和unique为二维向量去重时为何多出空向量?

问题根因
  • 核心错误是std::vector::erase的调用参数不符合预期。std::unique不会直接删除元素,只会将排序后相邻的重复元素移动到容器尾部,返回去重后有效元素区间的尾后迭代器,从这个迭代器到容器原end()位置的所有元素都是待清理的无效残留。
  • C++中std::vector的移动操作会保证被移动的源对象后置为有效空状态,unique移动重复元素到尾部的过程中,被移动的源子向量就会变成空向量,残留在待清理的尾部区间。
  • 你当前使用的单参数erase重载,仅会删除传入迭代器指向的单个元素,不会清理后续整个残留区间,那些移动后留下的空向量自然就保留在了最终结果里。
修复代码

只需要修正erase的入参,传入两个迭代器明确待删除的范围:从unique返回的位置开始,到容器实际末尾结束,一次性清理所有无效残留即可。

sort(final_vec.begin(), final_vec.end());
// 双参数erase指定删除范围,彻底清理所有重复残留
final_vec.erase(unique(final_vec.begin(), final_vec.end()), final_vec.end());

注:std::sort对二维vector的默认字典序比较规则,和unique判断元素相等的规则完全匹配,排序+unique的去重逻辑本身没有问题,空向量异常完全由erase参数错误导致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:51:31