c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】
技术百科
穿越時空
发布时间:2026-01-01
浏览: 次 std::unique不会真正删除元素,仅将相邻重复项移至末尾并返回新逻辑尾迭代器;必须配合erase才能完成真实去重,且要求容器先排序以确保相同元素相邻。
直接说结论:std::unique 本身**不会真正删除元素**,它只把重复项“挤到末尾”,并返回一个新末尾迭代器;必须配合容器的 erase 成员函数才能完成真实删除。很多人卡在这一步,以为调用完 std::unique 就去重完了。
为什么 std::unique 要求容器已排序?
std::unique 只移除「相邻重复项」,不关心全局是否重复。比如 {1,2,1} 经 std::unique 后仍是 {1,2,1} —— 因为两个 1 不相邻。
- 它内部逻辑是:从第二个元素起,逐个与前一个比较,相等就跳过(标记为待移除)
- 所以必须先用
std::sort排序,让相同值聚在一起 - 对
std::list可用其成员函数unique()(自动处理指针),但普通序列容器如std::vector必须手动配对sort + unique + erase
vector 去重的标准三步写法
这是最常出错的地方:漏掉 erase,或用错迭代器范围。
-
std::sort(v.begin(), v.end())—— 先排序(默认升序) -
auto new_end = std::unique(v.begin(), v.end())—— 返回去重后逻辑结尾(指向第一个冗余元素) -
v.erase(new_end, v.end())—— 真实擦除冗余部分
std::vectorv = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3}; std::sort(v.begin(), v.end()); // → {1,1,2,3,3,4,5,5,6,9} auto it = std::unique(v.begin(), v.end()); // → it 指向第2个1之后的位置(即索引2) v.erase(it, v.end()); // → {1,2,3,4,5,6,9}
自定义类型去重要注意什么?
如果容器存的是自定义结构体,std::unique 默认用 operator== 比较,但前提是它得能访问到这个函数;同时 std::sort 需要 operator 或传入比较函数。
- 确保
operator==正确定义(非 const 或参数类型不匹配会导致编译失败) - 若用 lambda 或函数对象做
sort比较,unique仍只认==,两者语义必须一致,否则结果不可预测 - 性能上:
std::uniq是 O(n) 时间,但前面的
uesort是 O(n log n),整体瓶颈在排序
最容易被忽略的是:当容器含浮点数或自定义精度比较时,== 判等可能失效;这时候不能直接用 std::unique,得自己写循环 + epsilon 比较 + 手动移动元素。
# 的是
# 这是
# 很多人
# 第一个
# 移除
# 第二个
# 自定义
# 迭代
# auto
# 循环
# 对象
# c++
# 指针
# 为什么
# 仍是
# operator
# 成员函数
# 结构体
# Lambda
# const
# sort
# 升序
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php怎么捕获异常_trycatch结构处理运行时
- 如何解决同一段404代码在不同主机上表现不一致的问
- Windows笔记本无法进入睡眠模式怎么办?(电源
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- Python函数接口稳定性_版本演进解析【指导】
- 如何在Golang中优化文件读写性能_使用缓冲和并
- Windows10系统怎么查看显卡驱动_Win10
- Windows如何拦截2345弹窗广告_Windo
- Windows如何使用BitLocker To G
- Win11怎么查看硬盘型号_Windows 11检
- Python解释执行模型_字节码流程说明【指导】
- Win10如何卸载Skype_Win10卸载Sky
- 如何使用Golang实现聊天室消息存档_存储聊天记
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- Win11怎么开启移动热点_Windows11共享
- 如何使用Golang搭建本地API测试环境_快速验
- Windows10怎么查看系统激活状态_Windo
- 如何使用Golang实现Web表单数据绑定_自动映
- Win10系统怎么查看网络连接状态_Windows
- Win10系统更新错误0x80240034怎么办
- c++怎么使用std::filesystem遍历文
- 短链接怎么用php还原_从基础原理到代码实现教学【
- Win11关机界面怎么改_Win11自定义关机画面
- Win11笔记本怎么看电池健康度_Win11电池报
- Win11怎么设置任务栏透明_Windows11使
- 如何在Golang中指定模块版本_使用go.mod
- Win11输入法切换快捷键怎么改_Windows
- Win10路由器怎么隐藏ssid Win10隐藏w
- php怎么连接数据库_MySQL数据库连接的基础代
- php订单日志怎么记录物流_php记录订单物流变更
- Mac如何创建和管理多个桌面空间_Mac高效多任务
- Win11怎么关闭粘滞键_彻底禁用Windows
- Win10电脑怎么设置网络名称_Windows10
- Win11时间格式怎么改成12小时制 Win11时
- Python 模块的 __name__ 属性如何由
- Linux怎么查找死循环进程_Linux系统负载分
- Win11怎么查看局域网电脑_Windows 11
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- php中作用域操作符能访问私有静态属性吗_访问权限
- Win11怎么设置单手模式_Win11触控键盘布局
- php增删改查需要哪些扩展_开启mysqli或pd
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- 如何在Golang中使用encoding/gob序
- Win11如何设置省电模式 Win11开启电池节电
- PHP怎么接收前端传的时间戳_处理时间戳参数转换技
- 如何使用Golang操作指针变量_Golang解引
- Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Windows10怎么卸载预装软件_Windows
- Win11怎么设置默认PDF阅读器 Win11修改

ue
QQ客服