C++标准模板库(STL)——set常见用法详解
- set的定义
set<typename> name;
typename可以是任何基本类型,如int、double、char、结构体等,也可以是STL标准容器,如vector、set、queue等。
set<int> name;
set<double> name;
set<char> name;
set<node> name; //node是结构体类型
- set容器内元素的访问
set只能通过迭代器访问:
set<typename>::iterator it;
例如下面的代码:
1 #include <iostream>
2 #include <set>
3 using namespace std;
4 set<int> st;
5 int main()
6 {
7 st.insert(2);
8 st.insert(5);
9 st.insert(2);
10 st.insert(6);
11 st.insert(2);
12 for(set<int>::iterator it=st.begin(); it!=st.end(); it++){
13 cout<<*it<<" ";
14 }
15 return 0;
16 }
输出结果:
2 5 6
从输出结果我们能发现,set内的元素自动递增排序,并且自动去除了重复元素。
- set常用函数
(1)insert()
insert(x)可以将x插入到set容器中,自动递增排序并去重,时间复杂度为O(logN),其中N为set内的元素个数,前面的例子即说明了这一点。
(2)find()
find(v)返回set中对应的v的迭代器,时间复杂度为O(logN),其中N为set内的元素个数。
1 #include <iostream>
2 #include <set>
3 using namespace std;
4 set<int> st;
5 int main()
6 {
7 for(int i=0;i<5;i++){
8 st.insert(i+1);
9 }
10 set<int>::iterator it=st.find(1);
11 cout<<*it;
12 return 0;
13 }
输出结果:
1
(3)erase()
erase()可以删除单个元素,也可以删除一个区间内的所有元素。
① 删除单个元素
st.erase(it),it为所需要删除元素的迭代器。时间复杂度为O(1)。
1 #include <iostream>
2 #include <set>
3 using namespace std;
4 set<int> st;
5 int main()
6 {
7 st.insert(100);
8 st.insert(200);
9 st.insert(200);
10 st.insert(300);
11 st.erase(st.find(200)); //利用find()函数找到200,然后用erase删除它
12 for(set<int>::iterator it=st.begin(); it!=st.end(); it++){
13 cout<<*it<<" ";
14 }
15 return 0;
16 }
输出结果:
100 300
st.erase(v),v为所需要删除元素的值。时间复杂度为O(logN),其中N为set内的元素个数。
1 #include <iostream>
2 #include <set>
3 using namespace std;
4 set<int> st;
5 int main()
6 {
7 st.insert(100);
8 st.insert(200);
9 st.insert(200);
10 st.insert(300);
11 st.erase(200); //删除set中值为200的元素
12 for(set<int>::iterator it=st.begin(); it!=st.end(); it++){
13 cout<<*it<<" ";
14 }
15 return 0;
16 }
输出结果:
100 300
② 删除一个区间内的所有元素
st.erase(first, last)可以删除一个区间内的所有元素,其中first为所需要删除区间的起始迭代器,而last则为所需要删除区间的末尾迭代器的下一个地址,即删除[first,last)。时间复杂度为O(last-first)。
1 #include <iostream>
2 #include <set>
3 using namespace std;
4 set<int> st;
5 int main()
6 {
7 st.insert(100);
8 st.insert(200);
9 st.insert(300);
10 st.insert(400);
11 set<int>::iterator it=st.find(200);
12 st.erase(it,st.end()); //删除元素200至set末尾之间的元素
13 for(set<int>::iterator it=st.begin(); it!=st.end(); it++){
14 cout<<*it<<" ";
15 }
16 return 0;
17 }
输出结果:
100
(4)size()
size()用来获得set内元素的个数,时间复杂度为O(1)。
1 #include <iostream>
2 #include <set>
3 using namespace std;
4 set<int> st;
5 int main()
6 {
7 st.insert(1);
8 st.insert(2);
9 st.insert(3);
10 st.insert(4);
11 cout<<st.size();
12 return 0;
13 }
输出结果:
4
(5)clear()
clear()用来清空set中的所有元素,时间复杂度O(N),其中N为set内的元素个数。
1 #include <iostream>
2 #include <set>
3 using namespace std;
4 set<int> st;
5 int main()
6 {
7 st.insert(1);
8 st.insert(2);
9 st.insert(3);
10 st.insert(4);
11 st.clear(); //清空set
12 cout<<st.size();
13 return 0;
14 }
输出结果:
0
C++标准模板库(STL)——set常见用法详解的更多相关文章
- C++标准模板库(STL)——queue常见用法详解
queue的定义 queue<typename> name; queue容器内元素的访问 由于队列本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素, ...
- C++标准模板库(STL)——vector常见用法详解
vector的定义 vector<typename> name; 相当于定义了一个一维数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间,通俗来讲,vector就是& ...
- C++标准模板库(STL)——map常见用法详解
map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...
- STL vector常见用法详解
<算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...
- STL pair 常见用法详解
<算法笔记>学习笔记 pair 常见用法详解 //pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素, //又不想因此定义结构体时,使用pair ...
- STL stack 常见用法详解
<算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...
- STL priority_queue 常见用法详解
<算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...
- STL queue 常见用法详解
<算法笔记>学习笔记 queue 常见用法详解 queue翻译为队列,在STL中主要则是实现了一个先进先出的容器. 1. queue 的定义 //要使用queue,应先添加头文件#incl ...
- STL map 常见用法详解
<算法笔记>学习笔记 map 常见用法详解 map翻译为映射,也是常用的STL容器 map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器) 1. map 的定义 / ...
随机推荐
- poj2987最大权闭包(输出最少建塔个数)
题意: 公司要裁员,每个员工被裁掉之后都会有一定的收益(正或者负),有一些员工之间有限制关系,就是裁掉谁之前必须要先裁掉另一个人,问公司的最大收益和最大收益前提下的最小裁员人数? 思路: ...
- Windows认证体系解读
目录 Windows认证方式 Windows本地认证 NTLM认证方式(工作组环境中) wiresharek抓包NTLMv2,使用Hashcat爆破 NTLM认证方式(域环境中) Kerberos认证 ...
- (2) arm 指令条件码
条件码助记符 标志 含义 EQ Z=1 相等 NE Z=0 不相等 CS/HS C=1 无符号数大于或等于 CC/LO C=0 无符号数小于 MI N=1 负数 PL N=0 正数或0 VS V=1 ...
- <JVM中篇:字节码与类的加载篇>01-Class字节码文件结构
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- 【译】N 皇后问题 – 构造法原理与证明 时间复杂度O(1)
[原] E.J.Hoffman; J.C.Loessi; R.C.Moore The Johns Hopkins University Applied Physics Laboratory *[译]* ...
- SpringBoot面向切面编程(AOP)
Aspect (与SpringBoot整合) 总结 作用位置 try{ try{ @Around 前置环绕通知 @Before 前置通知 method.invoke(..); }catch(){ @A ...
- vscode 终端操作命令npm报错
错误: 如果没有安装的node.js ,则需要安装. node.js官网下载地址: https://nodejs.org/zh-cn/ 安装node.js 后会看到C:\Users\XXX\AppDa ...
- 15 个让新手爱不释手的 Python 高级库
为什么我喜欢 Python ? 对于初学者来说,这是一种简单易学的编程语言:另一个原因:大量开箱即用的第三方库,正是 23 万个由用户提供的软件包使得 Python 真正强大和流行 在本文中,我挑选了 ...
- 一个入门级CTF的Reverse
这道题是XCTF攻防世界上的一道新手入门题目! 年前刚接触逆向时IDA,OD了这些工具都不会用(负基础),当时做这些题的时候觉得挺难(主要是缺少练习,没思路无从下手).现在回头再来看这些题目感觉确实是 ...
- 客户端保存token到sessionStorage
将token保存到客户端的sessionStorage 一.区分localStorage和sessionStorage localStorage是本地持久化存储 sessionStorage是浏览器会 ...