• 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. LA3635派

    题意:       有F+1个人来分n个圆形派,每个人分到的必须是一个整块的派,形状无所谓,每个人分到的必须一样多,给你每个派的半径,问每个人能分到的最大派的面积是多少. 思路:       虽然不是 ...

  2. UVA10881蚂蚁

    题意:      在一个木棍上有只小蚂蚁,他们的移动速度都是1,移动的时候如果和别的蚂蚁碰面,那么碰面的这两只小蚂蚁会马上掉头继续走,给你每只蚂蚁的初始距离木棒左端点的距离和方向,以及木棍长度,问你t ...

  3. hdu1914 稳定婚姻问题

               稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时 ...

  4. 数据人必读!玩转数据可视化用这个就够了——高德LOCA API 2.0升级来袭!

    引言 "一图胜千言",大数据时代来临,数据与人们生活密切相关.复杂难懂且体量庞大的数据给人的感觉总是冷冰冰的,让人难以获取到重点信息,也找不出规律和特征,数据价值发挥不出来.空间数 ...

  5. vue-router的几种用法

    1.全局路由守卫 router.beforeEach((to, from, next) => { // ... }) 当一个导航触发时,全局前置守卫按照创建顺序调用.守卫是异步解析执行,此时导航 ...

  6. Codeforces Round #712 (Div. 2)

    A. Déjà Vu 题意:就是问能否加上字母a,使得字符串不中心对称 思路:只有一种情况不能加入,就是全部是a,剩下的都可以满足,找a的位置就找哪个字母不是a,然后让它的对称位置是新加的这个a 代码 ...

  7. [论文阅读笔记] Fast Network Embedding Enhancement via High Order Proximity Approximati

    [论文阅读笔记] Fast Network Embedding Enhancement via High Order Proximity Approximation 本文结构 解决问题 主要贡献 主要 ...

  8. Java中volatile关键字你真的理解了吗?

    面:你怎样理解volatile关键字时? 我:不加思索的说出,volatile修饰的成员变量,可保证线程可见性.不保证原子性和禁止指令重排. 面:你能谈谈什么是线程可见性吗? 我:各个线程对主内存中共 ...

  9. [DB] Spark SQL

    概述 基于Spark,兼容Hive 集成在Spark中,不需单独安装 提供统一的数据访问方式 结构化的数据类型:JDBC.JSON.Hive.Parquet(Saprk SQL 默认数据源) 支持标准 ...

  10. [刷题] 167 Two Sum II

    要求 升序数组 找到两个数使得它们相加之和等于目标数 函数返回两个下标值(下标从1开始) 示例 输入:numbers = [2, 7, 11, 15], target = 9 输出:[1,2] 思路 ...