新闻中心
C++ vector如何去重_C++ unique函数与erase组合使用技巧
去重需先排序再用std::unique与erase组合,或用unordered_set配合remove_if保持顺序。std::unique仅移除连续重复元素并返回新末尾,需erase清理内存;保持顺序时使用哈希表记录已见元素,遍历一次完成去重,时间复杂度O(n)。

在C++中,对vector进行去重是一个常见需求。最高效且常用的方法是结合使用std::unique和vector::erase。需要注意的是,std::unique并不会真正删除元素,它只是将重复的元素“移到”容器末尾,因此必须配合erase才能实现真正的内存清理。
使用unique与erase组合去重
std::unique要求容器中的元素是已排序的,否则只会去除连续重复的元素。因此,在使用前通常需要先排序。
基本步骤如下:
- 调用
std::sort对vector排序,使相同元素相邻 - 使用
std::unique将重复元素移动到末尾,并返回新的逻辑结尾迭代器 - 用
erase删除从该迭代器到实际末尾的所有元素
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> vec = {5, 2, 8, 2, 1, 5, 3};
// 排序使相同元素相邻
std::sort(vec.begin(), vec.end());
// 去重并擦除
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
// 输出结果:1 2 3 5 8
for (int n : vec) std::cout << n << " ";
}
保持原始顺序的去重方法
如果不想改变原vector的元素顺序,就不能先排序。此时可以借助std::unordered_set记录已出现的元素,然后使用std::remove_if配合自定义谓词来标记重复项。
std::vector<int> vec = {5, 2, 8, 2, 1, 5, 3};
std::unordered_set<int> seen;
vec.erase(
std::remove_if(vec.begin(), vec.end(), [&seen](const int& value) {
if (seen.count(value)) {
return true; // 标记为待移除
}
seen.insert(value);
return false;
}),
vec.end()
);
这种方法遍历一次vector,利用哈希表快速查找,时间复杂度为O(n),适合对顺序敏感的场景。
美图云修
商业级AI影像处理工具
50
查看详情
unique函数的工作原理说明
std::unique会比较相邻元素,若相等则跳过后面的元素,只保留第一个。它返回一个迭代器,指向去重后的新末尾。原容器大小不变,被“去重”的元素仍存在于内存中,直到手动erase。
关键点:
-
std::unique不改变容器大小 - 只对连续重复元素有效,因此常需预排序
- 可用于自定义比较函数,如忽略大小写去重字符串
基本上就这些。掌握unique和erase的组合用法,能高效处理大多数去重场景。是否排序取决于是否需要保持原有顺序。不复杂但容易忽略细节。
以上就是C++ vector如何去重_C++ unique函数与erase组合使用技巧的详细内容,更多请关注其它相关文章!
# 何为
# 江干区推广网站哪家好用
# 济南网站优化地址
# 杨浦区上海网站建设推广
# 网站优化 工具有哪些
# 长沙网站建设学习
# 建设网站需要多少钱
# 淘宝关键词搜索指数排名
# 滕州网站建设价格优惠
# 田小茜seo培训
# 安阳谷歌seo
# 如何实现
# 移除
# go
# 何去
# 迭代
# 自定义
# 遍历
# 使用技巧
# 都是
# 美图
# red
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
2026年CSGO开箱网站推荐 CSGO开箱平台精选
邮政快递单号查询入口 邮政快递物流信息在线查询入口
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
实现全屏滚动与导航点:专业教程
Python模块化编程:有效管理依赖与避免循环引用
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间
快手赚钱渠道_快手收益来源
抖音网页版企业服务中心登录入口_抖音网页版企业登录平台
Spyder启动失败:字体文件权限拒绝错误解决方案
58动漫网在线官方网 58动漫网正版动漫入口网址
蛙漫安全无毒 官方认证的绿色入口
Fabric模组开发:自定义物品与物品组的现代管理方法
抖音网页版平台入口 抖音网页版官网在线访问教程
解决Flask中Quill编辑器内容提交失败及TypeError的指南
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】
HTML长属性值处理:表单action路径优化与代码规范应对
poki免费入口快捷访问 poki人气小游戏直接玩站点
Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】
Angular中父组件异步更新子组件复选框状态的实践指南
QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
c++ 命名空间怎么用 c++ namespace使用指南
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
Python大型XML文件高效流式解析教程
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
CSS Grid如何控制元素对齐_align-items与justify-items组合使用
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南
C#中解析不规范的HTML为XML 常见的坑与解决办法
BetterDiscord插件中安全更新用户简介的实践指南
C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件
小米汽车11月交付量突破40000台!雷军:将继续努力
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
高德地图怎么看全景照片_高德地图全景照片浏览教程
C++ vector二维数组定义_C++ vector of vector用法
火锅吃太多会怎样 火锅吃太多会上火吗
学习通网页版官方登录 超星学习通电脑端入口指南


2025-11-26
浏览次数:次
返回列表