【STL十】关联容器——set容器、multiset容器
【STL十】关联容器——set容器、multiset容器
- 一、set简介
- 二、头文件
- 三、模板类
- 四、set的内部结构
- 五、成员函数
- 1、迭代器
- 2、元素访问
- 3、容量
- 4、修改操作
- ~~5、操作~~
- 5、查找
- 6、查看操作
- 六、demo
- 1、查找find
- 2、修改操作insert
- 3、修改操作erase、clear
- 七、multiset
set和multiset会根据特定的排序准则,自动将元素排序。两者不同之处在于multiset允许元素重复而set不允许。(如下图)

一、set简介
- 和 map、multimap 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。
- map、multimap 容器都会自行根据键的大小对存储的键值对进行排序,set 容器也会如此,只不过 set 容器中各键值对的键 key 和值 value 是相等的,根据 key 排序,也就等价为根据 value 排序。
- 使用 set 容器存储的各个元素的值必须各不相同。更重要的是,从语法上讲 set 容器并没有强制对存储元素的类型做 const 修饰,即 set 容器中存储的元素的值是可以修改的。但是,C++ 标准为了防止用户修改容器中元素的值,对所有可能会实现此操作的行为做了限制,使得在正常情况下,用户是无法做到修改 set 容器中元素的值的。
对于初学者来说,切勿尝试直接修改 set 容器中已存储元素的值,这很有可能破坏 set 容器中元素的有序性,最正确的修改 set 容器中元素值的做法是:先删除该元素,然后再添加一个修改后的元素。
二、头文件
#include<set>
三、模板类
template < class T, // 键 key 和值 value 的类型class Compare = less<T>, // 指定 set 容器内部的排序规则class Alloc = allocator<T> // 指定分配器对象的类型> class set;
四、set的内部结构
-
set/multiset通常以平衡二叉树完成(balanced binary tree);(如下图)
-
自动排序的主要优点在于令二叉树于查找元素时拥有良好效能。其查找函数具有对数复杂度。在拥有 1000 个元素的 set 或 multiset 中查找元素,二叉树查找动作(由成员函数执行)的平均时间为线性查找(由STL 算法执行)的 1/50。
-
但是,自动排序造成 set 和 multiset 的一个重要限制:你不能直接改变元素值,因为这样会打乱原本正确的顺序。
因此,要改变元素值,必须先删除旧元素,再插入新元素。以下接口反映了这种行为:- Set 和 multiset 不提供任何操作函数可以直接访问元素。
- 通过迭代器进行元素间接访问,有一个限制:从迭代器的角度看,元素值是常量。

五、成员函数
1、迭代器
| 成员函数 | 功能 |
|---|---|
| begin() | 同array容器 |
| end() | 同array容器 |
| rbegin() | 同array容器 |
| rend() | 同array容器 |
| cbegin() | 同array容器 |
| cend() | 同array容器 |
| crbegin() | 同array容器 |
| crend() | 同array容器 |
2、元素访问
| 成员函数 | 功能 |
|---|---|
3、容量
| 成员函数 | 功能 |
|---|---|
| size() | 同array容器 |
| max_size() | 同array容器 |
| empty() | 同array容器 |
4、修改操作
| 成员函数 | 功能 |
|---|---|
| clear() | 同vector容器 |
| insert() | 同vector容器 |
| insert_or_assign(C++17) | 插入元素,或若键已存在则赋值给当前元素 |
| emplace() | 同vector容器 |
| emplace_hint() | 在本质上和 emplace() 在 map 容器中构造新键值对的方式是一样的,不同之处在于,使用者必须为该方法提供一个指示键值对生成位置的迭代器,并作为该方法的第一个参数。 |
| try_emplace(C++17) | 若键不存在则原位插入,若键存在则不做任何事 |
| erase() | 同vector容器 |
| swap() | 同vector容器 |
| extract(C++17) | 从另一容器释出结点 |
| merge(C++17) | 从另一容器接合结点 |
5、操作
5、查找
| 成员函数 | 功能 |
|---|---|
| count(key) | 同map容器 |
| find(key) | 同map容器 |
| contains (C++20) | 同map容器 |
| equal_range(key) | 同map容器 |
| lower_bound(key) | 同map容器 |
| upper_bound(key) | 同map容器 |
6、查看操作
| 成员函数 | 功能 |
|---|---|
| key_comp | 同map容器 |
| value_comp | 同map容器 |
六、demo
1、查找find
- 返回值
指向键等于 key 的元素的迭代器。若找不到这种元素,则返回尾后(见 end() )迭代器。
#include <iostream>
#include <string> // string
#include<set>
using namespace std;
int main() {set <string> myset{"小b","小c","小a","小d",};auto ite = myset.find("小d");cout << "find = " << *ite << endl;for (auto iter = myset.begin(); iter != myset.end(); ++iter) {cout << *iter << endl;}return 0;
}
输出
find = 小d
小a
小b
小c
小d
2、修改操作insert
返回值
- lower_bound:指向首个不小于 key 的元素的迭代器。若找不到这种元素,则返回尾后迭代器
- upper_bound:指向首个大于 key 的元素的迭代器。若找不到这种元素,则返回尾后迭代器
正常场景
#include <iostream>
#include <string> // string
#include<set>
using namespace std;
int main() {set <string> myset{"小b","小c","小a","小d",};auto ite = myset.insert("小e");cout << *(ite.first) << " " << ite.second << endl;set<string> set2;set2.insert(myset.begin(), myset.end());for (auto iter = set2.begin(); iter != set2.end(); ++iter) {cout << *iter << endl;}return 0;
}
输出
小e 1
小a
小b
小c
小d
小e
3、修改操作erase、clear
- erase
set 类模板中,erase() 方法有 3 种语法格式,分别如下:
//删除 set 容器中值为 val 的元素
size_type erase (const value_type& val);
//删除 position 迭代器指向的元素
iterator erase (const_iterator position);
//删除 [first,last) 区间内的所有元素
iterator erase (const_iterator first, const_iterator last);
demo
#include <iostream>
#include<set>
using namespace std;
int main() {set <int> myset{ 1,2,3,4,5 };int num = myset.erase(2);cout << "num = " << num << endl;cout << "myset.size = " << myset.size() << endl << endl;set<int>::iterator ite = myset.erase(myset.begin());cout << "ite = " << *ite << endl;cout << "myset.size = " << myset.size() << endl << endl;set<int>::iterator ite2 = myset.erase(myset.begin(),--myset.end());cout << "ite = " << *ite2 << endl;cout << "myset.size = " << myset.size() << endl;return 0;
}
输出
num = 1
myset.size = 4
ite = 3
myset.size = 3
ite = 5
myset.size = 1
- clear
语法格式如下:
void clear();
显然,该方法不需要传入任何参数,也没有任何返回值。
#include <iostream>
#include<set>
using namespace std;
int main() {set <int> myset{ 1,2,3,4,5 };cout << "myset.size = " << myset.size() << endl;myset.clear();cout << "myset.size = " << myset.size() << endl;return 0;
}
输出
myset.size = 5
myset.size = 0
七、multiset
和set 容器不同的是,multiset 容器可以存储多个值相同的元素。
- 模板类
template < class T, // 存储元素的类型class Compare = less<T>, // 指定容器内部的排序规则class Alloc = allocator<T> > // 指定分配器对象的类型> class multiset;
- demo
#include <iostream>
#include <set>
using namespace std;
int main() {std::multiset<int> mymultiset{ 1,2,2,2,3,4,5 };cout << "multiset size = " << mymultiset.size() << endl;cout << "multiset count(2) =" << mymultiset.count(2) << endl;//删除容器中所有值为 2 的元素int num = mymultiset.erase(2);cout << "删除了 " << num << " 个元素 2" << endl;//输出容器中存储的所有元素for (auto iter = mymultiset.begin(); iter != mymultiset.end(); ++iter) {cout << *iter << " ";}return 0;
}
- 输出
multiset size = 7
multiset count(2) =3
删除了 3 个元素 2
1 3 4 5
参考:
1、C++ STL 容器库 中文文档
2、STL教程:C++ STL快速入门
3、https://www.apiref.com/cpp-zh/cpp/header.html
4、https://en.cppreference.com/w/cpp/container
相关文章:
【STL十】关联容器——set容器、multiset容器
【STL十】关联容器——set容器、multiset容器一、set简介二、头文件三、模板类四、set的内部结构五、成员函数1、迭代器2、元素访问3、容量4、修改操作~~5、操作~~5、查找6、查看操作六、demo1、查找find2、修改操作insert3、修改操作erase、clear七、multisetset和multiset会根…...
什么是Node.js
文章目录什么是Node.js简介常用命令Node内置模块Node.js和JavaScript的区别什么是Node.js 简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它允许开发者使用JavaScript编写服务器端代码,而不仅仅是浏览器端的代码。Node.js的出现使得JavaScript可以在…...
比GPT-4 Office还炸裂,阿里版GPT全家桶来袭
疯狂3月的那一天,一切还历历在目。 微软突然在发布会上放出大招,用Microsoft 365 Copilot掀起了办公软件革命。 而今天,阿里也放出一枚重磅炸弹——阿里版的Copilot也要来了! 并且比微软更彻底的是,阿里全系产品也都…...
mysql 建表约束
主键约束 -- 主键约束 -- 使某个字段不重复且不得为空,确保表内所有数据的唯一性。 CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(20) );-- 联合主键 -- 联合主键中的每个字段都不能为空,并且加起来不能和已设置的联合主键重复。 CREATE TABLE …...
在Vue项目中使用tinymce富文本编辑器
TinyMC编辑器简介 TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。跟其他富文本编辑器相比,有着丰富的插件,支持多种语言,能够满足日常的业务需求并且免费。 TinyMCE的优势: 开源可商用,基于LGPL2.1 插…...
GPT-4 和ChatGPT API的定价分析
OpenAI发布了他们的ChatGPT新机器学习模型GPT-4。GPT-4是GPT-3的一大进步,GPT-3是当前ChatGPT免费版本(GPT 3.5 Turbo)所运行的模型的基础,今天我们也来凑个热点,研究一下它们的定价 GPT-4新的功能 GPT-4可以在对话中使用图像,并…...
基于html+css的盒子展示2
准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...
【持续更新篇】SLAM视觉特征点汇总+ORB特征点+VINS前端
Harris角点 opencv函数 cornerHarris提取输入图像的Harris角点 检测原理 检测思想:使用一个固定窗口在图像上进行任意方向的滑动,对比滑动前后的窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有较大灰度变化…...
【C语言】初阶指针(指针及其类型以及野指针)
简单不先于复杂,而是在复杂之后。 目录 1. 指针是什么? 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 1. 指针是什么? 指针理解的两个要点: 1. 指针是内存中最小…...
UDS统一诊断服务【六】访问时序参数0X83服务
文章目录前言一、访问时序参数服务介绍二、数据格式2.1 请求报文2.2 子功能2.3 响应三、举例前言 本文介绍UDS统一诊断服务的访问时序参数0X83服务,希望能对你有所帮助 一、访问时序参数服务介绍 这个服务我目前在项目中没怎么用到过,先来看看ISO14229…...
Linux应用编程(文件属性与目录)
本章将会讨论如下主题内容。 ⚫ Linux 系统的文件类型; ⚫ stat 系统调用; ⚫ 文件各种属性介绍:文件属主、访问权限、时间戳; ⚫ 符号链接与硬链接; ⚫ 目录; ⚫ 删除文件与文件重命名。 一、Linux 系统中…...
第十四届蓝桥杯嵌入式详解
目录 第一部分 客观试题(15 分) 不定项选择(1.5 分/题) 第二部分 程序设计试题(85 分) 2.1 STM32CubeMX初始化配置 2.1.1 配置GPIO 2.1.2 配置ADC 2.1.3 配置RCC 2.1.4 配置定时器TIM 2.1.5 配置ADC1、AD…...
新建论文三线表模板,一键格式刷
论文三线表模板写在最前面①表设计,新建表格样式②三线表上下线③三线表标题线④设置表格居中⑤设置表头格式容易出错的步骤写在最前面 论文写完啦,准备调整格式 之前建模也是三线表,但只能基于该文档模板,所以重新设置一下。 如…...
攻防世界-web2(逆向加密算法)
打开链接是PHP源码 给了一串密文,并对这串密文进行了一系列操作加密,注释里说解密$miwen就是flag 在此我们先介绍一些PHP内置函数: strrev(string): 反转字符串 strlen(string): 返回字符串的长度 substr(string, start, length): 返回字符…...
C语言学习1--------Visual Studio集成开发环境的搭建
C语言学习1--------Visual Studio集成开发环境的搭建适合初学者适用集成开发环境下载 Visual Studio 2019安装 Visual Studio 2019安装工作负载为C自定义安装位置激活 Visual Studio适合初学者适用集成开发环境 建议初学者适用最新的——Visual Studio 2019为集成开发环境。 部…...
腾讯云轻量应用服务器搭建网站教程(WordPress为例)
腾讯云轻量应用服务器搭建WordPress网站教程,先安装WordPress应用镜像,然后远程连接轻量应用服务器获取WP用户名和密码,域名DNS解析到轻量服务器IP地址,登陆WordPress后台管理全过程,腾讯云百科来详细说下腾讯云轻量服…...
mac上的PCB设计软件现状
Altium Designer是一款商业化的电路板设计软件,目前没有Mac版本。但是,MacOS上有一些类似Altium Designer的电路板设计软件,以下是一些常用的软件: Eagle:Eagle是一款商业化的电路板设计软件,具有强大的功能…...
【面试题】JavaScript 你常用的 函数有哪些呢? (12个)
大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 本文收集了 12 个在日常开发中非常常用的函数,有些可能很复杂,有些可…...
Java集合——Set接口学习总结
一、HashSet实现类 1.常用方法 增加:add(E e)删除:remove(Object o)、clear()修改:查看:iterator()判断:contains(Object o)、isEmpty()常用遍历方式:Set<String> set new HashSet<String>()…...
2023最全的自动化测试入门基础知识(建议收藏)
1)首先,什么是自动化测试? 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的过程一步步执行测试,得到实际结果与期望结果的比较。…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
