STL——SET操作与并交差
一:set的集合运算
推荐一篇:https://blog.csdn.net/u014023993/article/details/47614381
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
void put_in(set<int> &p){
int q;
cin>>q;
while(q --){
int value;
cin>>value;
p.insert(value);
}
}
void put_out(set<int> &p){
set<int>::iterator it = p.begin();
while(it != p.end()){
cout<<*it<<" ";
it ++;
}
}
void Intersection(set<int> &A,set<int> &B,set<int> &result){
set<int>::iterator it;
it = A.begin();
while(it != A.end()){
if(B.find(*it) != B.end()) result.insert(*it);
it++;
}
}
void Union(set<int> &A,set<int> &B,set<int> &result){
set<int>::iterator it;
it = A.begin();
while(it != A.end()){
result.insert(*it);
it++;
}
it = B.begin();
while(it != B.end()){
result.insert(*it);
it++;
}
}
void Difference(set<int> &A,set<int> &B,set<int> &result){
set<int>::iterator it;
it = A.begin();
while(it != A.end()){
if(B.find(*it) == B.end()) result.insert(*it);
it++;
}
}
int main(){
set<int> RUnion,RIntersec,RDiff1,RDiff2;
int iarr1[]={1,2,3,3,4,5,6,7,9};
int iarr2[]={1,4,3,9,10};
set<int> A(iarr1,iarr1+8);
set<int> B(iarr2,iarr2+4);
Intersection(A,B,RIntersec);
Union(A,B,RUnion);
Difference(A,B,RDiff1);
Difference(B,A,RDiff2);
cout<<"A交B:";put_out(RIntersec); cout<<endl;
cout<<"A并B:";put_out(RUnion); cout<<endl;
cout<<"A-B:";put_out(RDiff1); cout<<endl;
cout<<"B-A:";put_out(RDiff2); cout<<endl;
cout << "RIntersec_size:" << RIntersec.size() << endl;
cout << "RUnion_size:" << RUnion.size();
return 0;
}
set总结
关于set有下面几个问题:
(1)为何map和set的插入删除效率比用其他序列容器高?
大部分人说,很简单,因为对于关联容器来说,不需要做内存拷贝和内存移动。说对了,确实如此。set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点。结构图可能如下:
A
/ \
B C
/ \ / \
D E F G
因此插入的时候只需要稍做变换,把节点的指针指向新的节点就可以了。删除的时候类似,稍做变换后把指向删除节点的指针指向其他节点也OK了。这里的一切操作就是指针换来换去,和内存移动没有关系。
(2)为何每次insert之后,以前保存的iterator不会失效?
iterator这里就相当于指向节点的指针,内存没有变,指向内存的指针怎么会失效呢(当然被删除的那个元素本身已经失效了)。相对于vector来说,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程中可能已经被其他内存覆盖或者内存已经被释放了。即使时push_back的时候,容器内部空间可能不够,需要一块新的更大的内存,只有把以前的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后,那么以前的内存指针自然就不可用了。特别时在和find等算法在一起使用的时候,牢记这个原则:不要使用过期的iterator。
(3)当数据元素增多时,set的插入和搜索速度变化如何?
如果你知道log2的关系你应该就彻底了解这个答案。在set中查找是使用二分查找,也就是说,如果有16个元素,最多需要比较4次就能找到结果,有32个元素,最多比较5次。那么有10000个呢?最多比较的次数为log10000,最多为14次,如果是20000个元素呢?最多不过15次。看见了吧,当数据量增大一倍的时候,搜索次数只不过多了1次,多了1/14的搜索时间而已。你明白这个道理后,就可以安心往里面放入元素了。
2.set中常用的方法
begin() ,返回set容器的第一个元素
end() ,返回set容器的最后一个元素
clear() ,删除set容器中的所有的元素
empty() ,判断set容器是否为空
max_size() ,返回set容器可能包含的元素最大个数
size() ,返回当前set容器中的元素个数
rbegin ,返回的值和end()相同
rend() ,返回的值和rbegin()相同
写一个程序练一练这几个简单操作吧:
#include <iostream>
#include <set>using namespace std;int main()
{set<int> s;s.insert(1);s.insert(2);cout << s.insert(3).second <<"插入成功" <<endl ;cout << s.insert(1).second <<"插入失败" <<endl;cout<<"set 的 size 值为 :"<<s.size()<<endl;cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;s.clear();if(s.empty()){cout<<"set 为空 !!!"<<endl;}cout<<"set 的 size 值为 :"<<s.size()<<endl;cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;return 0;
}
STL——SET操作与并交差相关推荐
- C++STL常用操作之prev、next篇
C++STL常用操作之prev.next篇 简介: 1.prev:反向 2.next:位移 我们先建立一个set容器,在容器中放入1-10这10个数字 set<int> s; for(in ...
- STL常用操作:deque
1.初始化 deque<int> deq; //创建一个空的deque deque<int> deq(deq1); //用一个已有的deque初始化当前deque deque& ...
- 计算机技师操作考试题库含答案,计算机三级试题与答案
出国留学网小编们精心为广大考生准备了"2017年计算机三级考试数据库技术模拟试题及答案(7)",各位同学赶快学起来吧,做好万全准备,祝各位同学考试顺利通过.更多相关资讯请持续关注出 ...
- stl源码剖析_《STL源码剖析》学习笔记——空间配置器
目录 1. 空间配置器概述 2. 构造和析构基本工具 3. 空间的配置与释放,std::alloc 4. 内存基本处理工具 1. 空间配置器概述 从STL的实现角度来看,空间配置器的位置尤为重要,整个 ...
- C/C++学习之路: STL
C/C++学习之路: STL 目录 STL概述 STL三大组件 常用容器 1. STL概述 STL(Standard Template Library,标准模板库),主要出现在 c++中,但是在引入 ...
- STL 源码剖析 空间配置器
以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container) 的背后 但是STL的操作对象都存放在容器的内部,容器离不开内存空间的分配 为什么 ...
- 用法 stl_C++STL 容器篇
前言 上一章节主要是详细介绍了C++泛型编程基础,不清楚的可以回顾一下哦.本章节主要针对于C++STL(标准模板类库)做个详细介绍.标准模板类库也就是别人写的模板类,主要内容是各种数据结构的封装,以及 ...
- STL和FIG文件的结构
stl文件直接用Notepad++打开时,出现的全部是乱码.但是想搞清楚stl中到底写了些什么,所以找一下相关资料. .STL的文件用什么软件能打开?_百度知道 http://zhidao.baidu ...
- STL源码剖析(第二章 空间配置器)
1.1 空间配置器 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以置放资料.并且allocator称之为&qu ...
最新文章
- java tcp端口复用_windows server tcp端口重用问题
- [转载]一个Spectral Clustering方法的小结
- 我犯了一个错误,您能指出吗?
- ICCV 2019 | 通过多标签相关性研究提升神经网络视频分类能力
- python基础list_Python基础4(list:列表)
- ios加载本地游戏html,使用WKWebView iOS加载本地HTML / Javascript
- You have unstaged changes.
- 为什么Facebook的API以一个循环作为开头?
- 安费诺amphenol连接器_安费诺的Ellison谈信号完整性职业和他的免费开源PCB设计软??件...
- 解决安装Xcode后无法在终端执行gcc的问题
- 在python3.5中使用pip
- 华硕B365能装服务器系统吗,原生支持Win7,大师级B365主板来了! 华硕PRIME B365M-A主板深度体验-华硕主板bios设置图解...
- 测试计划、用例、测试报告、缺陷报告总结
- 4pda.ru注册验证的解码算法
- 计算机硬件维修书,计算机硬件维修手册
- 苹果电脑怎么更换计算机模式,图文详解苹果电脑如何切换成windows系统
- 国家信息中心副主任周民:加快形成网络安全的亮剑精神
- 10种食物让女性养颜排毒又减肥(图)
- 2019杭电多校第七场 HDU - 6656 Kejin Player——概率期望
- 2014.10.10 ——Jim Foley第二场讲座User Interface Design——An Overview