• 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常见用法详解的更多相关文章

  1. C++标准模板库(STL)——queue常见用法详解

    queue的定义 queue<typename> name; queue容器内元素的访问 由于队列本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素, ...

  2. C++标准模板库(STL)——vector常见用法详解

    vector的定义 vector<typename> name; 相当于定义了一个一维数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间,通俗来讲,vector就是& ...

  3. C++标准模板库(STL)——map常见用法详解

    map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...

  4. STL vector常见用法详解

    <算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...

  5. STL pair 常见用法详解

    <算法笔记>学习笔记 pair 常见用法详解 //pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素, //又不想因此定义结构体时,使用pair ...

  6. STL stack 常见用法详解

    <算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...

  7. STL priority_queue 常见用法详解

    <算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...

  8. STL queue 常见用法详解

    <算法笔记>学习笔记 queue 常见用法详解 queue翻译为队列,在STL中主要则是实现了一个先进先出的容器. 1. queue 的定义 //要使用queue,应先添加头文件#incl ...

  9. STL map 常见用法详解

    <算法笔记>学习笔记 map 常见用法详解 map翻译为映射,也是常用的STL容器 map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器) 1. map 的定义 / ...

随机推荐

  1. hdu4849 最短路

    题意:       让你求0到所有点最短路中对m取余最小的那个数. 思路:       简单题,直接根据题目给的公式把z求出来,然后建边,然后最短路,然后枚举每一个点对m取余记录最小,然后输出答案,然 ...

  2. 缓冲区溢出分析第06课:W32Dasm缓冲区溢出分析

    漏洞报告分析 学习过破解的朋友一定听说过W32Dasm这款逆向分析工具.它是一个静态反汇编工具,在IDA Pro流行之前,是破解界人士必然要学会使用的工具之一,它也被比作破解界的"屠龙刀&q ...

  3. Android Dex文件格式解析

    Dex文件是Android虚拟机下的可执行文件,包含了应用程序所用到所有操作指令和运行时数据.在程序编译过程中,java源文件先被编译成class文件,然后通过dx工具将多个class文件整合为一个d ...

  4. 哈希爆破神器Hashcat的用法

    目录 HashCat HshCat的使用 使用Hashcat生成字典 使用Hashcat破解NTLMv2 HashCat HashCat系列软件在硬件上支持使用CPU.NVIDIA GPU.ATI G ...

  5. ConcurrentHashMap源码解读二

    接下来就讲解put里面的三个方法,分别是 1.数组初始化方法initTable() 2.线程协助扩容方法helpTransfer() 3.计数方法addCount() 首先是数组初始化,再将源码之前, ...

  6. BUAA软件工程_结对编程

    1.写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 结对项目作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 培养结对编程开发项目的能力 ...

  7. [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]

    [操作系统知识储备,进程相关概念,开启进程的两种方式.进程Queue介绍] 操作系统知识回顾 为什么要有操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作 ...

  8. Go快速入门(二)

    提示:本系列文章适合有其他语音基础并对Go有持续冲动的读者 一.package介绍 ​ Go语言的代码是通过package来组织的,package的概念和你知道的其它语言 里的libraries或者m ...

  9. Java数组学习之前基础小案例

    不多说,1天时间看完数组之前内容,这就靠代码的实践总结一下吧~~ 打印三角形 简单易懂,初学都会,就不注释了,前者为取巧的三角形实现方法,我注释了,直接上源码~~ public class Trian ...

  10. mysql 使用 source/mysqldump 命令导入/导出文件信息

    要导入/导出数据库信息,使用 mysql 的source命令可以方便快速的处理 以MAC为例: 一.mysqldump命令导出SQL文件 /usr/local/mysql/bin/mysqldump ...