C++ set 常用部分

文章目录

    • 关键特性
    • 定义及初始化
    • 一些基本操作
    • 查找
    • 插入
    • 删除
    • 清空
    • 遍历
    • lower_bound()、upper_bound()
    • set与unordered_set的区别

关键特性

  • 唯一性:Set容器内的元素都是唯一的,每个元素都是不同的
  • 有序性:Set容器内的元素总是排序的(C++中默认升序),向Set中添加元素,将自动插入到正确的位置中,不需要手动排序
  • 查找/插入快速:因为Set容器的元素是排序的,所以在Set中查找和插入元素都很快

定义及初始化

#include <set>
set<Type> s;						      
set<int> s = {1,2,3,4,5};	 
vector<int> a = {1,2,3,4,5};
set<int> s(a.begin(),a.end());
set<Type> s(s1);			              //定义一个set容器,并用容器s1来初始化
set<Type> s(b, e);					  //b和e分别为迭代器的开始和结束的标记
set<Type> s(s1.begin(), s1.begin()+3); //用容器s1的第0个到第2个值初始化s
set<Type> s(a, a + 5);      		      //将a数组的元素初始化vec向量
set<Type> s(&a[1], &a[4]); 			  //将a[1]~a[4]范围内的元素作为s的初始值

一些基本操作

s.begin();					//返回指向第一个元素的迭代器
s.end();					//返回指向最后一个元素的迭代器
s.clear();					//清除所有元素
s.count();					//返回某个值元素的个数
s.empty();					//如果集合为空,返回true,否则返回false
s.equal_range();			//返回集合中与给定值相等的上下限的两个迭代器
s.erase();					//删除集合中的元素
s.find(k);					//返回一个指向被查找到元素的迭代器
s.insert();					//在集合中插入元素
s.lower_bound(k);			//返回一个迭代器,指向键值大于等于k的第一个元素
s.upper_bound(k);			//返回一个迭代器,指向键值大于k的第一个元素
s.max_size();				//返回集合能容纳的元素的最大限值
s.rbegin();					//返回指向集合中最后一个元素的反向迭代器
s.rend();					//返回指向集合中第一个元素的反向迭代器
s.size();					//集合中元素的数目

查找

find(x)方法寻找带有特定键的元素,返回的是迭代器。

set<int> s = {1,2,3,4,5};if(s.find(3)!=s.end())//若存在,返回一个迭代器,指向键值;若不存在,返回一个迭代器,指向s.end()。cout<<*s.find(3)<<endl;
elsecout<<"NOT FOUND"<<endl;

count(x)方法返回的是set中元素x的个数。由于个数只能是0或1,所以当返回值非0时表示元素在集合中,反之不在。

set<int> s = {1,2,3,4,5};if(s.count(3) > 0)cout << s.count(3) << endl;
elsecout<<"NOT FOUND"<<endl;

插入

//插入一个元素
set<int> s;
s.insert(10);
//插入多个元素
vector<int> array{1, 2, 3};
int a[] = {1,2,3};
set<int> s;
s.insert(array.begin(), array.end()); 
s.insert(a,a+3);
//使用emplace函数插入元素
set<int> s;
s.emplace(10);

删除

语法格式

set_name.erase(element);//删除 set 容器中值为 val 的元素
name.erase(iterator position);//删除 position 迭代器指向的元素
name.erase(iterator start, iterator end);//删除 [start,end) 区间内的所有元素

示例

set<int> myset={1,2,3,4,5};
myset.erase(30);
myset.erase(myset.find(3));
myset.erase(myset.begin(),myset.end())

Reference:

https://vimsky.com/examples/usage/unordered_set-erase-function-in-c-stl.html
https://www.cainiaojc.com/cpp/cpp-set-erase-function.html
https://c.biancheng.net/view/7198.html
https://blog.csdn.net/chenyijun/article/details/119065095

清空

myset.clear();

遍历

迭代器遍历

set<int> myset={1,2,3,4,5};for(auto it = mySet.begin(); it != mySet.end(); it++)
{cout<<*it<<" ";
}
cout<<endl;

for循环新用法

set<int> myset={1,2,3,4,5};
for(auto i : myset){cout<<i<<endl;
}

lower_bound()、upper_bound()

lower_bound(key_value) :返回第一个大于等于key_value的定位器

upper_bound(key_value):返回第一个大于key_value的定位器

set<int> s={1,2,3,4,5};cout<<*s.lower_bound(1)<<" ";
cout<<*s.lower_bound(2)<<" ";
cout<<*s.upper_bound(3)<<" ";//输出:1 2 4

set与unordered_set的区别

set与unordered_set一样,都是关联式容器,和 map 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 value 必须相等。

当使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值(也就是 key 的值)即可。

使用 set 容器存储的各个元素的值必须各不相同

从语法上讲 set 容器并没有强制对存储元素的类型做 const 修饰,即 set 容器中存储的元素的值是可以修改的。但是,C++ 标准为了防止用户修改容器中元素的值,对所有可能会实现此操作的行为做了限制,使得在正常情况下,用户是无法做到修改 set 容器中元素的值的。

主要区别:

set

  • 定义于头文件
  • 底层实现通常是平衡二叉树
  • 元素自动排序,这为查找元素提供了良好性能,但同时也造成了一个重要限制:不能直接改变元素值,因为这会打乱原本正确的顺序
  • 查找函数具有对数复杂度
  • 要改变元素的值,必须先删除该元素,再插入新元素

unordered_set

  • 定义于<unordered_set>头文件
  • 底层实现通常是hash-table
  • 元素是无序的
  • 插入、删除、查找元素的时间复杂度是常量的(排除偶尔的rehashing导致的线性复杂度)

总结

综上,以下情况使用set:

  • 需要排序的数据
  • 需要通过前序、后序等方式遍历元素或者查找前继后继元素
  • 想要使用binary_search(), lower_bound() and upper_bound()等需要在有序元素上使用的方法
  • 其他平衡二叉树具有而hash表没有的优点

在以下情况使用unordered_set:

  • 仅需要保存互异的元素而不需要排序
  • 只需要获取单个元素而不需要遍历

两者的区别参考:

https://zhuanlan.zhihu.com/p/439197313
https://blog.csdn.net/bryant_zhang/article/details/111600209
https://zhuanlan.zhihu.com/p/131009604

reference:

https://blog.csdn.net/weixin_44668898/article/details/102089892

还可以参考:

https://zhuanlan.zhihu.com/p/682656691

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

electron+VUE Browserwindow与webview通信

仅做记录 前言&#xff1a; electronVUEVITE框架&#xff0c;用的是VUE3.0 主进程定义&#xff1a;用于接收webview发送的消息 ipcMain.on(MyWebviewMessage, (event, message) > {logger.info(收到webmsg message)//转发给渲染进程}) porelaod/webPreload.js定义 cons…

C语言编译与链接

前言 我们想一个问题&#xff0c;我们写的C语言代码都是文本信息&#xff0c;电脑能直接执行c语言代码吗&#xff1f;肯定不能啊&#xff0c;计算机能执行的是二进制指令&#xff0c;所以将C语言转化为二进制指令需要一段过程&#xff0c;这篇博客讲一下编译与链接&#xff0c;…

跨域问题详解(vue工程中的解决办法)

目录 1. 什么是跨域 2. 如何解决跨域问题 1. 配置request.js 2. 配置vite.config.js 1. 什么是跨域 跨域问题指的是当一个网页的源&#xff08;origin&#xff09;与另一个网页的源不同时&#xff0c;浏览器出于安全考虑&#xff0c;会限制页面中的跨域请求。源是由协议、主…

五种主流数据库:高级分组

除了基本的分组功能之外&#xff0c;GROUP BY 子句还提供了几个高级选项&#xff0c;可以用来实现更复杂的报表功能。 本文比较五种主流数据库实现的高级分组功能&#xff0c;包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。 功能MySQLOracleSQL ServerPostgreSQL…

Day26 手撕各种集合底层源码(一)

Day26 手撕各种集合底层源码&#xff08;一&#xff09; 一、手撕ArrayList底层源码 1、概念&#xff1a; ArrayList的底层实现是基于数组的动态扩容结构。 2、思路&#xff1a; 1.研究继承关系 2.研究属性 3.理解创建集合的过程 – 构造方法的底层原理 4.研究添加元素的过程…

vue实现把Ox格式颜色值转换成rgb渐变颜色值(开箱即用)

图示&#xff1a; 核心代码&#xff1a; //将0x格式的颜色转换为Hex格式&#xff0c;并计算插值返回rgb颜色 Vue.prototype.$convertToHex function (colorCode1, colorCode2, amount) {// 确保输入是字符串&#xff0c;并检查是否以0x开头let newCode1 let newCode2 if (t…

关系型数据库mysql(5)存储引擎

目录 一.存储引擎的概念 二. MyISAM 和 InnoDB 2.1MyISAM介绍 2.2MyISAM支持的存储格式 2.2.1静态表&#xff08;固定长度表&#xff09; 2.2.2动态表 2.2.3压缩表 2.3场景举例 2.4.InnoDB 2.4.1场景举例 2.4.2企业选择存储引擎依据 三.查看存储引擎 3.1查看当前数…

IMU预积分【SLAM】

前言 预积分的推导过程比较多&#xff0c;所以这里只记录关键结论。 其实这些公式不太好记忆&#xff0c;因为预积分推导过程的想法来源很巧妙&#xff0c;无法看出物理意义。 预积分定义式&#xff08;必须记住&#xff09; 一切推导的来源&#xff1a; 最好记忆的旋转相对…

c语言教务成绩管理系统1000+

定制魏:QTWZPW,获取更多源码等 目录 题目 代码主函数 教务信息头文件 题目 编写一个C语言程序,实现一个教务成绩管理系统,至少能够管理30条学生信息。其中: 1)学生信息包括:基本信息和成绩信息。 2)基本信息包括:班级,学号,姓名,性别,专业,普通课程选修数…

C++中的STL简介与string类

目录 STL简介 STL的版本 STL的六大组件 string类 标准库中的string类 string类的常用接口 string类对象对容量的操作 size()函数与length()函数 capacity()函数 capacity的扩容方式 reserve()函数 resize()函数 string类对象的操作 push_back()函数 append()函数 operator()函数…

【01-20】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【01-20】计算机网络基础知识&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用1、OSI 的七层模型分别是&#xff1f;各自的功能是什么&#xff1f;2、说一下一次完整的HTTP请求…

1688中国站按关键字搜索工厂数据 API

公共参数 名称类型必须描述keyString是申请免费调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…

记录何凯明在MIT的第一堂课:神经网络发展史

https://www.youtube.com/watch?vZ5qJ9IxSuKo 目录 表征学习 主要特点&#xff1a; 方法和技术&#xff1a; LeNet 全连接层​ 主要特点&#xff1a; 主要特点&#xff1a; 网络结构&#xff1a; AlexNet 主要特点&#xff1a; 网络结构&#xff1a; Sigmoid Re…

经典永不过时 Wordpress模板主题

经得住时间考验的模板&#xff0c;才是经典模板&#xff0c;带得来客户的网站&#xff0c;才叫NB网站。 https://www.jianzhanpress.com/?p2484

最详细爬虫零基础教程12——某网评论爬取教程

文章目录 前言一、单页爬取二、翻页案例 前言 本文我们主要是讲述一个某网站评论爬取的案例 一、单页爬取 目标url&#xff1a;https://ke.qq.com/course/380991/12573838881968191?tuin7265bf35#term_id100454125 import jsonpath import requestsif __name__ __main__:#…

HCIP杂记

动态路由的评判标准 占用资源收敛速度选路 动态路由分类&#xff1a; IGP---内部网关协议 DV型---距离矢量型---RIPLS型---链路状态型---OSPFEGP---外部网关协议 OSPF---无类别的路由协议 组播224.0.0.5和224.0.0.6不存在周期更新机制&#xff0c;仅存在触发更新机制&#xff1…

Elasticsearch如何处理多个关键字查询

Elasticsearch (ES) 是一款强大的全文搜索和分析引擎。当针对Elasticsearch进行含有多个关键字的查询时&#xff0c;ES通常会使用其内置的查询DSL&#xff08;Domain Specific Language&#xff09;来处理这些请求。一般来讲&#xff0c;基于多个关键字&#xff0c;可以构建不同…

第十五届蓝桥杯第三期模拟赛第十题 ← 上楼梯

【问题描述】 小蓝要上一个楼梯&#xff0c;楼梯共有 n 级台阶&#xff08;即小蓝总共要走 n 级&#xff09;。小蓝每一步可以走 a 级、b 级或 c 级台阶。 请问小蓝总共有多少种方案能正好走到楼梯顶端&#xff1f;【输入格式】 输入的第一行包含一个整数 n 。 第二行包含三个整…

vulfocus环境搭建(kali搭建)

Vulfocus 是一个漏洞集成平台&#xff0c;将漏洞环境 docker 镜像&#xff0c;放入即可使用&#xff0c;开箱即用。 安装docker环境 个人不建议随意更换apt源&#xff0c;我换了几次遇到很多问题。 apt-get update apt-get upgrade&#xff08;时间很久&#xff09; apt-get i…