新闻中心

C++ vector如何去重_C++ unique函数与erase组合使用技巧

2025-11-26
浏览次数:
返回列表
去重需先排序再用std::unique与erase组合,或用unordered_set配合remove_if保持顺序。std::unique仅移除连续重复元素并返回新末尾,需erase清理内存;保持顺序时使用哈希表记录已见元素,遍历一次完成去重,时间复杂度O(n)。

c++ vector如何去重_c++ unique函数与erase组合使用技巧

在C++中,对vector进行去重是一个常见需求。最高效且常用的方法是结合使用std::uniquevector::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不改变容器大小
  • 只对连续重复元素有效,因此常需预排序
  • 可用于自定义比较函数,如忽略大小写去重字符串

基本上就这些。掌握uniqueerase的组合用法,能高效处理大多数去重场景。是否排序取决于是否需要保持原有顺序。不复杂但容易忽略细节。

以上就是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用法  火锅吃太多会怎样 火锅吃太多会上火吗  学习通网页版官方登录 超星学习通电脑端入口指南 

搜索