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 的定义 / ...
随机推荐
- 基于Frida框架打造Art模式下的脱壳工具(OpenMemory)的原理分析
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80956614 作者dstmath在看雪论坛公布一个Android的art模式下基 ...
- node-util
Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherit ...
- 【JavaScript】JS从入门到深入(复习查漏向
[JavaScript]JS从入门到深入(复习查漏向 pre 精细得学过一遍JS后才发现,原来之前CTF中有些nodejs的题目以及一些游戏题的payload就变得很好理解了. 基础知识 ECMASc ...
- 上手 WebRTC DTLS 遇到很多 BUG?浅谈 DTLS Fragment
上一篇<详解 WebRTC 传输安全机制:一文读懂 DTLS 协议>详细阐述了 DTLS.本文将结合 DTLS 开发中遇到的问题,详细解读 DTLS 的一些基础概念以及 Fragment ...
- computed和watch的区别
严格上来说,计算属性能够实现的效果,watch都可以实现.只是有时候watch写起来比较麻烦. 但是watch能够实现的效果computed不一定能够实现. 1:watch内部可以包含异步操作,com ...
- CRM系统有哪几种常见类型?
随着市场的快速变化,客户开始变得越来越重要,因此CRM客户管理系统开始逐渐被企业所认可.从CRM系统进入中国市场到现在十余年的发展中,越来越多的CRM厂商开始出现.为了满足不同行业.不同类型的企业的需 ...
- Vue | 指令实现自动翻译填充英文名功能
背景:应用系统中存在多个创建实体表单,表单填写时,在填写中文名称后,要填写对应的英文名作为标识或数据库查询索引. 需求:填写中文名的同时,系统自动生成英文名并填充到表单中,辅助用户操作,节约操作时间. ...
- 重新整理 .net core 实践篇————依赖注入应用[二]
前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...
- Python运算符 - Python零基础入门教程
目录 一.算术运算符 二.赋值运算符 三.比较运算符 四.运算符的优先等级 五.重点总结 六.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...
- 对于uos目前只能安装商店的感慨,强制安装除外
对于uos目前只能安装商店的感慨,强制安装除外 jie1018 / 2020-5-16 21:35 浏览: 702 / 回复: 26 个人觉得,在软件不足的情况下,更应该是系统支持,而不是让用 ...