关于set

set是以特定的顺序存储相异元素的容器。

set是关联式容器,C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。

查找、插入、删除的时间复杂度都是O(logn)

一些特点:

1、在插入或赋初值时会自动排序(除非是unordered_set)

2、不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素

3、不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数

4、每次insert或者erase之后,以前保存的iterator不会失效(关联式容器,只改变了一些指针的指向,原指针指向的内存没变)(当然,直接erase保存的指针肯定改变了)

set中的模板函数

begin()    返回指向第一个元素的迭代器

end()       返回指向最后一个元素的后一个位置的迭代器

clear()    清空内容

size()     返回当前元素个数

count(key_value)  用来查找set中某个键值出现的次数,在set只可能为0或1

erase(key_value)       删除键值为key_value的元素

erase(iterator)            删除迭代器iterator指向的元素

erase(first,second)    删除迭代器first和second之间的元素,[first,second)

find(key_value)          返回指向key_value的迭代器,如果没有找到返回end()

insert(key_value)      将key_value插入到set中

lower_bound(key_value)    返回第一个大于等于key_value的迭代器

upper_bound(key_value)   返回第一个大于key_value的迭代器

equal_range(key_value)     返回一对迭代器,first等同于lower_bound,second_bound等同于upper_bound,即 [lower_bound,upper_bound)

//若set<int>a,b; vector<int>c

set_union(a.begin(),a.end(),b.begin(),b.end(),back_insert(c))                        并集

set_intersection(a.begin(),a.end(),b.begin(),b.end(),back_insert(c))        交集

set_difference(a.begin(),a.end(),b.begin(),b.end(),back_insert(c))          差集

set_symmetric_difference(a.begin(),a.end(),b.begin(),b.end(),back_insert(c)) 对称差

//使用实例

//初始化set

//这个参考资料好少啊,自己尝试了这几种

 #include<cstdio>
#include<set>
using namespace std; int main()
{
int arr[] = { ,,,, }; //定义时赋初值
set<int>st1{,,,,};
set<int>st2 = { ,,,, };
set<int>st3(arr, arr + ); //先定义,后赋值
set<int>st4;
st4 = { ,,,, };
set<int>st5;
st5.insert(arr, arr + ); return ;
}

//基本操作

 #include<cstdio>
#include<set>
using namespace std; int main()
{
int arr[] = { , , , , , , , };
set<int>st(arr,arr + ); //遍历
//不像vector,只能通过迭代器进行间接存取
for (set<int>::iterator it = st.begin(); it != st.end(); it++)
printf("%d ", *it);
printf("\n"); //查找
//未找到返回end()
set<int>::iterator it = st.find();
if(it != st.end()) printf("%d\n", *it); //插入
//返回值为pair<set<int>::iterator,bool>
st.insert(); st.insert(); //删除
//不要去删除不存在的元素
st.erase(); st.erase(); //计数,是否在集合中
if (st.count()) printf("In\n");
else printf("Out\n"); //上下界函数
set<int>::iterator it1 = st.lower_bound();
set<int>::iterator it2 = st.upper_bound(); //区间定位
pair<set<int>::const_iterator, set<int>::const_iterator>pr;
pr = st.equal_range();
if(pr.second != st.end()) printf("%d %d\n", *pr.first, *pr.second); for (set<int>::iterator it = st.begin(); it != st.end(); it++)
printf("%d ", *it);
return ;
}

//集合操作

 #include<cstdio>
#include<set>
#include<vector>
#include<iterator> //inserter函数定义在里面
#include<algorithm> //set_union,set_intersection等定义在里面
using namespace std; int main()
{
//若待处理的集合用vecter保存,必须确保无重复且有序
//若用vector保存结果,使用函数back_inserter(dest)
vector<int>v1 = { ,,,,, };
vector<int>v2 = { ,,,,,, };
vector<int>dest1;
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(dest1));
//set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(dest));
//set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(dest));
//set_symmetric_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(dest)); //若用set保存结果,使用函数inserter(dest,dest.begin())
set<int>dest2;
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(dest2, dest2.begin())); //若待处理的集合用set保存,可以无序重复(会自动去重、排序)
set<int>s1 = { ,,,,,,,, };
set<int>s2 = { ,,,,,, };
set<int>dest3;
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(dest3, dest3.begin())); return ;
}

参考资料:

1、http://www.cplusplus.com/reference/set/set/?kw=set

2、https://blog.csdn.net/changjiale110/article/details/79108447

3、https://blog.csdn.net/rocky_56X/article/details/81772646

4、https://blog.csdn.net/yang20141109/article/details/51782027

STL:set的使用的更多相关文章

  1. 详细解说 STL 排序(Sort)

    0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...

  2. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  3. STL的std::find和std::find_if

    std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...

  4. STL: unordered_map 自定义键值使用

    使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...

  5. C++ STL简述

    前言 最近要找工作,免不得要有一番笔试,今年好像突然就都流行在线笔试了,真是搞的我一塌糊涂.有的公司呢,不支持Python,Java我也不会,C有些数据结构又有些复杂,所以是时候把STL再看一遍了-不 ...

  6. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  7. STL bind1st bind2nd详解

    STL bind1st bind2nd详解   先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...

  8. STL sort 函数实现详解

    作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...

  9. STL的使用

    Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等.而且它在STL中时间效率也很高效:几乎与数组不相上下. #include ...

  10. [C/C++] C/C++延伸学习系列之STL及Boost库概述

    想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...

随机推荐

  1. bzoj4593: [Shoi2015]聚变反应炉

    这道题的难点其实是在设DP方程,见过就应该会了 令f0,i表示先激发i的父亲,再激发i,把i的整棵子树都激发的最小费用 f1,i表示先激发i,再激发i的父亲,把i的整棵子树都激发的最小费用 设x,y为 ...

  2. UVALive3126 Taxi Cab Scheme —— 最小路径覆盖

    题目链接:https://vjudge.net/problem/UVALive-3126 题解: 最小路径覆盖:即在图中找出尽量少的路径,使得每个结点恰好只存在于一条路径上.其中单独一个点也可以是一条 ...

  3. 【Android进度条】三种方式实现自定义圆形进度条ProgressBar

    一.通过动画实现 定义res/anim/loading.xml如下: <?xml version="1.0" encoding="UTF-8"?> ...

  4. 创建cordova项目

    PhoneGap是一套能让你使用HTML5轻松调用本地API接口和发布应用到商店的应用开发平台.官方说有低成本,低开发周期,轻量化等优点,这些咱暂时也没法证明,略过不表.但是有一条跨平台,却是很明显的 ...

  5. Servlet启动运行顺序

    1.web项目执行属性 启动web项目后,web容器首先回去找web.xml文件,读取这个文件. 容器会创建一个 ServletContext ( servlet 上下文),整个 web 项目的所有部 ...

  6. 转【前端基础进阶之Promise】

    前言 Promise的重要性我认为我没有必要多讲,概括起来说就是必须得掌握,而且还要掌握透彻.这篇文章的开头,主要跟大家分析一下,为什么会有Promise出现. 在实际的使用当中,有非常多的应用场景我 ...

  7. WebUploader上传大文件时,上传出错问题

    上传普通文件没有问题,当文件达到一定大小的时候,上传错误,返回结果是404,我可以肯定的是路径是没有问题的.因为上传小文件等都是可以的. 然后使用webuploader的uploaderror监控错误 ...

  8. asp.net Identity2 角色(Role)的使用(二)角色管理,角色控制器和视图

    新建一个AdminViewModel 文件,建立视图模型类 public class RoleViewModel { public string Id { get; set; } [Required( ...

  9. nodejs--JWT 在前后端分离中的应用与实践

    nodejs--JWT 在前后端分离中的应用与实践 http://www.cnblogs.com/lidongyue/p/5269695.html

  10. (转) SQL Server中 ldf 文件过大的解决方法

    原文地址:http://blog.itpub.net/35489/viewspace-616459/ 在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为“自动收缩”外,还可以使用下 ...