0

0

C++ set和multiset用法详解_C++集合容器去重与查找技巧

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-16 19:26:03

|

821人浏览过

|

来源于php中文网

原创

set 不允许重复元素,multiset 允许;两者均基于红黑树实现,自动排序,提供插入、删除、查找等高效操作,常用遍历方式为范围for循环。

c++ set和multiset用法详解_c++集合容器去重与查找技巧

在C++标准模板库(STL)中,setmultiset 是两个非常实用的关联式容器,它们基于红黑树实现,能够自动对元素进行排序,并提供高效的插入、删除和查找操作。虽然两者功能相似,但在处理重复元素方面存在关键差异。本文将详细讲解它们的用法、区别以及常见操作技巧。

set 与 multiset 的基本特性

set 是一个有序集合容器,其中每个元素都是唯一的,不允许重复值。它会自动按照升序排列元素(默认使用

multiset 与 set 基本相同,唯一的不同是允许存储重复元素。也就是说,同一个值可以出现多次,其他操作方式几乎一致。

常用头文件:

立即学习C++免费学习笔记(深入)”;

#include

声明与初始化

定义 set 和 multiset 的语法如下:

std::set s; // 存储不重复整数的 set

std::multiset ms; // 可存储重复整数的 multiset

std::set<:string> names; // 字符串集合

支持初始化列表(C++11 起):

std::set s = {5, 2, 8, 2, 1}; // 实际内容为 {1,2,5,8},自动去重并排序

std::multiset ms = {5, 2, 8, 2, 1}; // 内容为 {1,2,2,5,8},保留重复项

插入与删除元素

使用 insert() 插入元素,erase() 删除元素。

插入示例:

s.insert(10);

s.insert({3, 7, 3}); // 插入多个值,重复的 3 不会被再次加入

insert 返回值:对于 set,返回 pair,bool 表示是否插入成功;multiset 总是插入成功,返回 iterator。

删除示例:

s.erase(5); // 删除值为 5 的元素

s.erase(it); // 删除指定迭代器指向的元素

s.erase(begin_it, end_it); // 删除范围内的元素

注意:erase 使用值删除时,会移除所有匹配项。在 multiset 中,这可能删除多个元素。

查找与遍历技巧

高效查找是 set/multiset 的强项。

find():查找指定值,返回迭代器。未找到则返回 end()。

auto it = s.find(3);

if (it != s.end()) { /* 找到了 */ }

count():统计某值出现次数。set 中只能是 0 或 1;multiset 可大于 1。

if (ms.count(2)) { /* 至少有一个 2 */ }

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

下载

lower_bound(x):返回第一个 ≥ x 的元素位置。

upper_bound(x):返回第一个 > x 的元素位置。

equal_range(x):返回 pair,表示值 x 的范围 [first, second),只在 multiset 中有意义。

遍历方式(推荐使用范围 for):

for (const auto& val : s) {

  std::cout

}

自定义比较规则

默认按升序排列,可通过仿函数或 lambda 自定义排序逻辑。

例如降序 set:

std::set> desc_set = {3, 1, 4, 1, 5}; // {5,4,3,1}

自定义结构体需提供比较函数:

struct Person {

  std::string name;

  int age;

};

struct Cmp {

  bool operator()(const Person& a, const Person& b) const {

    return a.age

  }

};

std::set people;

去重与性能建议

如果需要自动去重且保持有序,优先选择 set。

若允许重复数据但仍需快速查找和有序访问,使用 multiset。

常见误区:

  • 不要用 vector + sort + unique 实现去重逻辑,效率远低于 set
  • 频繁插入删除场景下,set 比排序数组更优
  • 大量只读查询可用 unordered_set 加手动排序替代,但失去自动排序优势

小技巧:从 multiset 构造 set 可实现快速去重:

std::set unique(ms.begin(), ms.end());

基本上就这些。合理利用 set 和 multiset,能让代码更简洁、高效。掌握它们的区别和核心操作,是提升 C++ 编程能力的重要一步。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

757

2023.08.22

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

526

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1491

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

621

2023.11.24

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.3万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号