当前位置: 首页 > news >正文

C++ STL 学习笔记(一):vector 去重的三种实现方法详解

C++ STL 学习笔记(一):vector 去重的三种实现方法详解

​ 在C++开发中,vector去重是最常见的数据处理需求。本文将详细介绍使用C++标准库中的sort(),unique(), erase()函数组合实现容器vector去重, 本笔记主要介绍三种实现方法:(1)基础数据类型去重;(2)自定义结构体使用sort+unique 去重;(3)使用set 去重;帮助开发者根据不同场景选择最优方案。

1.1 基础数据类型去重

unique()函数作用是去掉容器中相邻元素的重复元素,然后返回指向第一个重复元素的迭代器。unique()实质上是一个伪去除,它并不是真正把重复的元素删除,而是用不重复的元素把重复的元素覆盖了,所以总长度其实是不变的。

​ 因此在利用unique()函数前需要对容器内的数据排序,可以通过sort()函数实现。sort()函数的作用是对容器指定范围内的元素按指定格式进行排序,默认从小到大。在利用unique()函数后需要擦除从返回的迭代器对于的元素到最后元素的所有的元素,可以通过erase()函数实现。erase()函数的作用是擦除容器指定范围内的元素。综上所属:去除的主要思路:先用sort排序(让重复元素相邻)、再唯一(用unique 把重复元素移到容器的末尾)、最后用erase()于删除最后面的那段“重复”元素。对于

​ 对于基础类型数据(如int,float等),最简单直接的方法是使用上述的sort+unique+erase组合。下面是代码案例实现

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<int> vec = {1, 2, 3, 2, 1, 4, 5, 4};cout << "去重前: ";for (int num : vec) cout << num << " ";cout << endl;// 排序后去重sort(vec.begin(), vec.end());vec.erase(unique(vec.begin(), vec.end()), vec.end());cout << "去重后: ";for (int num : vec) cout << num << " ";cout << endl;return 0;
}

其中注意:

  • sort()函数的头文件:#include<algorithm>
  • unique()函数的头文件:#include<iostream>
  • erase()函数的头文件:#include<vector>

1.2 自定义结构体去重

​ 另外对于容器中,如结构体、类对象等,为了实现去重操作,还可以通过对sort算法需要重载<操作符或定义比较函数,对unique算法需要重载==操作符,通过对其中的某一个成员变量进行操作来实现,然后采用sort+unique+erase。其代码实现如下

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;struct Person {string name;int age;// 定义相等运算符bool operator==(const Person& other) const {return name == other.name && age == other.age;}
};// 定义比较函数
bool comparePerson(const Person& a, const Person& b) {if (a.name != b.name) return a.name < b.name;return a.age < b.age;
}int main() {vector<Person> people = {{"Alice", 25},{"Bob", 30},{"Alice", 25},{"Charlie", 35},{"Bob", 30}};cout << "去重前:\n";for (const auto& p : people) cout << p.name << " (" << p.age << ")\n";sort(people.begin(), people.end(), comparePerson);people.erase(unique(people.begin(), people.end()), people.end());cout << "\n去重后:\n";for (const auto& p : people) cout << p.name << " (" << p.age << ")\n";return 0;
}

其中关键点:

  • 必须定义operator==用于unique判断相等;

  • 代码简介,但会改变原始顺序;

  • 对于大型数据集合,利用set的集合去重更高效;

1.3 使用set进行去重

​ 对vector的去重操作还可以利用set容器的特性实现,思路比较简单,对于自定义类型,可以使用set自动去重的特性,需要定义operator<运算符。其案例代码如下

#include <iostream>
#include <vector>
#include <set>
using namespace std;struct Product {string id;double price;// 定义小于运算符bool operator<(const Product& other) const {if (id != other.id) return id < other.id;return price < other.price;}
};int main() {vector<Product> products = {{"P1001", 99.99},{"P1002", 199.99},{"P1001", 99.99},{"P1003", 299.99},{"P1002", 199.99}};cout << "去重前:\n";for (const auto& p : products) cout << p.id << " ($" << p.price << ")\n";// 使用set去重set<Product> uniqueProducts(products.begin(), products.end());products.assign(uniqueProducts.begin(), uniqueProducts.end());cout << "\n去重后:\n";for (const auto& p : products) cout << p.id << " ($" << p.price << ")\n";return 0;
}

其关键点如下

  • set基于operator<自动排序和去重;

  • 代码简洁,但会改变原始顺序

  • 对于大型数据集,set方法可能更高效

方法比较

方法 适用场景 时间复杂度 代码复杂度
sort+unique 基础数据类型 O(n log n) + O(n)
自定义结构体sort+unique 需要保持顺序的自定义类型 O(n log n) + O(n)
set去重 不需要保持顺序的自定义类型 O(n log n)

参考资料

C++中vector去重的三种实现方法详解_文心快码

STL之vector去重三步曲(利用unique函数)_vector unique-CSDN博客

http://www.jsqmd.com/news/365953/

相关文章:

  • 2026年降AI率保持原意的底层逻辑:为什么换词不如换结构
  • 2026年河北接地端子制造厂排名,技术强且售后好的品牌推荐 - 工业品网
  • 2026年降AI率保持原意的最大误区:不是每句话都要改
  • 2026年2月打标机品牌综合评估与选型指南 - 品牌推荐
  • 亲历AI浪潮5年:技术更新快,但掌握底层逻辑永远有价值
  • Alibaba Cloud Linux 是免费镜像
  • 面试官:ArrayList和LinkedList有什么区别?
  • 面向削峰填谷的电动汽车多目标优化调度策略:MATLAB 实现之旅
  • 2026年毕业论文降AI率怎么保持原意?学长踩坑经验分享
  • 教师人事系统:让教职工管理更轻松高效
  • macOS Catalina 10.15.8 (19H2036) 发布
  • 2026年答辩前降AI率怎么保持论文原意?紧急情况处理方案
  • 2026年2月中国打标机服务商发布:以济南中正金码为代表的标杆企业深度解析 - 品牌推荐
  • 在开始域渗透之前,先来简单了解下域的一些概念
  • 从0到1详解SpringBoot代码案例,阿里SpringBoot王者晋级之路真香
  • 高级Java工程师必备Netty技术怎么高效学习?
  • 2026年用DeepSeek降AI后意思全跑偏?换个方法一次搞定
  • 2026年唐香汉草沉香草本套产品优选:天津旭峰生物科技发展有限公司,深度解析关键考量 - 品牌推荐官
  • CTF比赛三个月能达到什么水平?
  • 医疗器械注册咨询公司推荐|五大正规机构提供中美欧多市场注册解决方案 - 速递信息
  • Python爬虫实战:优雅的绅士 - 利用 HTTP 协商缓存构建超低带宽增量爬虫!
  • 2026年度打标机设备推荐榜单:技术深度与行业应用双维度综合评估 - 品牌推荐
  • 北京十大留学机构申请决策指南:核心价值深度评估 - 博客湾
  • 2026 大连英语雅思培训教育机构推荐;雅思培训课程中心权威口碑榜单 - 老周说教育
  • 2026年2月打标机推荐:基于技术革新与场景适配维度的权威榜单 - 品牌推荐
  • windows表现驱动开发-对非 DX API 的容器帮助
  • MySQL啥时候用记录锁,啥时候用间隙锁?
  • 如何为复杂曲面选打标机?2026年打标机技术评测与推荐,解决定位精度痛点 - 品牌推荐
  • 告别低效繁琐!千笔,专科生专属的降AI率神器
  • 探寻知名的红色展厅设计品牌企业服务优势与价格 - 工业推荐榜