STL:set的使用
关于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的使用的更多相关文章
- 详细解说 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++标准库 ...
随机推荐
- bzoj3330: [BeiJing2013]分数
口胡 题目hint都给你是一个三分函数了 还不会上三分套三分吗 exp函数又卡 精度又卡 什么sb毒瘤题 浪费时间
- JFreeChart教程(一)(转)
JFreeChart教程(一) 分类: java Component2007-05-31 15:53 35268人阅读 评论(30) 收藏 举报 jfreechartimportdataset图形ap ...
- 关于追踪qemu 源码函数路径的一个方法
这阵子一直在研究qemu 磁盘io路径的源码,发现直接看代码是意见非常低效率的事情,qemu是一个比较庞大的家伙(源码部分大概154MB,完全由C语言来完成),整个结构也都非常地复杂,所以从代码上研究 ...
- 有向图强连通分量的Tarjan算法(转)
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- bleve搜索引擎源码分析之索引——mapping真复杂啊
接下来看看下面index部分的源码实现: data := struct { Name string Des string }{ Name: "hello world this is bone ...
- 【JSOI 2007】祖玛
[题目链接] 点击打开链接 [算法] f[i][j]表示第i段到第j段,最少需要多少次全部消除 那么,当color[i] = color[j]时 : 若s[i] + s[j] > 2,根据题目中 ...
- bzoj4196 [Noi2015]软件包管理器——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196 树链剖分. 代码如下: #include<iostream> #inclu ...
- P4475 巧克力王国(KDTree)
传送门 首先可以把约束条件看成一条直线,然后每个巧克力看成一个点,求给定区域内的点权和 用KDTree,每次判断一下当前矩形是否整个都在里面或都在外面,是的话直接返回,否则的话递归 注意,必须该矩形四 ...
- P2479 [SDOI2010]捉迷藏
传送门 KDtree是个吼东西啊-- 枚举每一个点,然后求出离他距离最远和最近的点的距离,更新答案 然而为什么感觉KDtree只是因为剪枝才能跑得动呢-- //minamoto #include< ...
- SpringMVC异步调用,Callable和DeferredResult的使用
Callable和DeferredResult都是springMVC里面的异步调用,Callable主要用来处理一些简单的逻辑,DeferredResult主要用于处理一些复杂逻辑 1.Callabl ...