C++ STL之Set
set是关联容器,类似于集合。
特点是里面的元素不会重复,而且元素时有序的。
1.声明定义:
#include<set> using namespace std; set<int> s;
2.常见用法
s.inert(); //插入
s.begin(); //返回s的第一个元素 s.end(); // 返回最后一个元素 s.clear() ; //清空 s.empty(); //判断是否为空 s.max_size() //返回最可能包含的元素最大个数 s.size(); //返回当前元素的个数 s.rbegin(); //同end() s.rend(); // 同begin() s.equal_range(); //返回集合中与给定值相等的上下限两个迭代器 s.erase(); //删除集合中的元素 s.lower_bound //返回大于或等于某值的第一个元素迭代器 s.key_comp(); //返回一个用于中间值比较的函数 s.upper_bound //返回大于的第一个元素迭代器
3.自定义比较函数
1)元素不是结构体:(自定义比较函数myComp,重载“()”操作符)
struct myComp{
bool operator() (const your_type &a,const your_type &b){
return a.data - b.data > ;
}
}
2)如果元素是结构体
struct Info{
string name;
int score;
bool operator<const Info &a) const{
return a.score < score;
}
}
---------------------------------------------------------------------------------------------
补充:
C++容器分为顺序容器和关联性容器:
顺序容器包括vector、deque、list、forward_list、array、string,所有顺序容器都提供了快速顺序访问元素的能力。
关联容器包括set、map的关联型容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。
关联容器不支持顺序容器的位置相关的操作。原因是关联容器中元素是根据关键字存储的,这些操作对关联容器没有意义。
而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值得操作。
关联容器支持高效的关键字查找和访问
map中的元素是一些关键字----值(key--value)对:关键字起到索引的作用,值则表示与索引相关联的数据。
set中每个元素只包含一个关键字:set支持高效的关键字查询操作----检查一个给定关键字是否在set中。
set封装的二叉树,所以它支持插入数据的排序,它是关联式容器,存储同一数据类型,set中的每一个元素都是唯一的,系统会根据元素的值自动进行排序。
它们内部采用的是平衡检索二叉树:红黑树,它的统计性能要好于一般的平衡二叉树。
1)map和set的插入删除效率要比其他序列容器高
对于关联容器来说,不需要内存拷贝和移动。
set容器所有元素都是以节点的方式来存储,节点结构和链表相似,指向父节点和子节点。插入和删除的时候改变的都是指针,不会移动内存。
2)每次insert之后,以前保存的iterator不会失效。
iterator等价于指向节点的指针,其内存没有发生变化,指向内存的指针也不会出现失效的情况。
对于vector来说,每一次插入和删除都有可能使指针失效,即使在尾部插入也是 如此。
这是因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入的过程可能已经被其他内存覆盖和释放了。
即使是用push_back的时候,容器的存储空间可能不够,需要一块更大的内存。
只有把以前的内存释放掉,申请更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后。
那么以前的内存指针必然不可再用了。
3)当元素增多的时候,set的插入和搜索速度变化是不变的。 红黑树的查找时间复杂度都是logN。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
未完待续
C++ STL之Set的更多相关文章
- 详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
- STL的std::find和std::find_if
std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...
- STL: unordered_map 自定义键值使用
使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...
- C++ STL简述
前言 最近要找工作,免不得要有一番笔试,今年好像突然就都流行在线笔试了,真是搞的我一塌糊涂.有的公司呢,不支持Python,Java我也不会,C有些数据结构又有些复杂,所以是时候把STL再看一遍了-不 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- STL bind1st bind2nd详解
STL bind1st bind2nd详解 先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...
- STL sort 函数实现详解
作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...
- STL的使用
Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等.而且它在STL中时间效率也很高效:几乎与数组不相上下. #include ...
- [C/C++] C/C++延伸学习系列之STL及Boost库概述
想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...
随机推荐
- tensorflow rank
可把tensorflow 中的tensor 理解为一个n维数组或列表, tensor 为静态变量,拥有动态维度.在tf中, 只有tensor能在节点和图计算中传递.
- 当鼠标悬停在链接上,或者点击过的链接,颜色会被设置为 #2a6496。同时,会呈现一条下划线。点击过的链接,会呈现一个颜色码为 #333 的细的虚线轮廓。另一条规则是设置轮廓为 5 像素宽,且对于基于 webkit 浏览器有一个 -webkit-focus-ring-color 的浏览器扩展。轮廓偏移设置为 -2 像素
a:hover, a:focus { color: #2a6496; text-decoration: underline; } a:focus { outline: thin dotted #333 ...
- Java IO输入输出流 字符数组流 ByteArrayOutputStream/ByteArrayInputStream
private static void StringWriterAndReader() throws Exception { //字符串流(字符串的内存流) //字符串输入流 StringWriter ...
- Java静态变量的用法:伪单例
这几天遇到一个问题,一个Service里有一个map,但是这个Service有别的继承,于是每一个Service都会创建一个map,但是这个map应该是公用的,于是就有问题了...(按结构说Servi ...
- Spring源码研究:数据绑定
在做Spring MVC时,我们只需用@Controllor来标记Controllor的bean,再用@RequestMapping("标记")来标记需要接受请求的方法,方法中第一 ...
- ecliplse集成SVN
按照下图操作 : SVN不同版本下载链接在文章底部有提供 上图点击add之后稍等一会就会弹出下图: 上图点击next之后: 最后等待完成之后重启ecliplse即可 重启ecliplse之后显示SVN ...
- 指针和动态分配内存 (不定长度数组)------新标准c++程序设计
背景: 数组的长度是定义好的,在整个程序中固定不变.c++不允许定义元素个数不确定的数组.例如: int n; int a[n]; //这种定义是不允许的 但是在实际编程中,往往会出现要处理的数据数量 ...
- python-判断语句介绍
1.生活中的判断场景 1.1 火车站安检 1.2 上网吧 2.开发中的判断场景 2.1 密码判断 2.2 重要日期判断 if 今天是周六或者周日: 约妹子 if 今天是情人节: 买玫瑰 if 今天发工 ...
- Unite Shanghai 2019全日程曝光(建议收藏)
https://mp.weixin.qq.com/s/KvAyXpDhqWROtTX1Ol3a4Q 5月10-12日,Unite Shanghai 2019即将在上海国际会议中心正式开幕.本次大会共设 ...
- 【bzoj4103】[Thu Summer Camp 2015]异或运算 可持久化trie树
Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i ...