【STL】STL之set
2015-09-14 17:51
120 查看
集合(set)实现了快速查找元素、插入元素以及删除元素。具体实现则采用了红黑树的二叉平衡搜素。
特点:
1.元素不重复。
2.采用中序遍历算法,使得效率比vector,map,list高。
3.自动按照key的大小排序。
一.创建set集合对象
在创建set对象时,与其他STL的容器一样,需要指定类型。
如果set的类型为自定义类型,那么在使用set之前,必须要重载运算符<<。在这里要尤其注意。
错误重载方法:
让我们看一下运行结果:
![](http://img.blog.csdn.net/20150914175710719)
而不是
11 22 33
11 33 44
正确写法
![](http://img.blog.csdn.net/20150914220402264)
所以说,不能偷懒少些代码。 O__O”…
二.插入
1.insert()
①insert(a)具体使用方法见上面的代码。
②insert(begin,end)将begin到end之间的元素插入set中
三.查找
1.find()
find(a) 返回元素a的地址
2.count()
count(a) 返回元素a的个数。然而蒟蒻认为该函数并没有什么用,因为在set中元素的个数不是1就是0,不过可以判断元素a是否存在。
四.删除 erase()函数
erase(a) 删除键为a的元素
erase(begin,end) 删除begin到end之间的元素
erase(iterator) 删除迭代器所指向的元素
五.常用函数
begin() rend() 返回set的初始地址
end() rbegin() 返回set的结束地址
clear() 清空set
size() 返回set中元素个数
empty() 判断set是否为空。若为空,返回true
六.遍历
使用迭代器iterator
特点:
1.元素不重复。
2.采用中序遍历算法,使得效率比vector,map,list高。
3.自动按照key的大小排序。
一.创建set集合对象
在创建set对象时,与其他STL的容器一样,需要指定类型。
#include <iostream> #include <set> using namespace std; set<int>s;
如果set的类型为自定义类型,那么在使用set之前,必须要重载运算符<<。在这里要尤其注意。
错误重载方法:
#include <set> #include <cstdio> using namespace std; struct node { int a ,b ,c ; node(){} node(const int a1,const int b1,const int c1) {a=a1 ,b=b1 ,c=c1 ;} bool operator < (const node &node2)const { return a<node2.a; } }; set<node>s; int main() { s.insert(node(1,2,3)); s.insert(node(1,3,4)); for(set<node>::iterator p=s.begin();p!=s.end();p++) printf("%d %d %d\n",p->a ,p->b ,p->c ); return 0; }
让我们看一下运行结果:
而不是
11 22 33
11 33 44
正确写法
#include <set> #include <cstdio> using namespace std; struct node { int a ,b ,c ; node(){} node(const int a1,const int b1,const int c1) {a=a1 ,b=b1 ,c=c1 ;} bool operator < (const node &node2)const { if(a!=node2.a)return a<node2.a; if(b!=node2.b)return b<node2.b; return c<node2.c; } }; set<node>s; int main() { s.insert(node(1,2,3)); s.insert(node(1,3,4)); for(set<node>::iterator p=s.begin();p!=s.end();p++) printf("%d %d %d\n",p->a ,p->b ,p->c ); return 0; }
所以说,不能偷懒少些代码。 O__O”…
二.插入
1.insert()
①insert(a)具体使用方法见上面的代码。
②insert(begin,end)将begin到end之间的元素插入set中
set<int>s; int num[]={1,2,3}; int main() { s.insert(num,num+3); return 0; }
三.查找
1.find()
find(a) 返回元素a的地址
set<int>s; int num[]={2,1,3}; int main() { s.insert(num,num+3); printf("%d\n",*(s.find(1))); return 0; }
2.count()
count(a) 返回元素a的个数。然而蒟蒻认为该函数并没有什么用,因为在set中元素的个数不是1就是0,不过可以判断元素a是否存在。
set<int>s; int num[]={2,1,3}; int main() { s.insert(num,num+3); printf("%d\n",s.count(1)); return 0; }
四.删除 erase()函数
erase(a) 删除键为a的元素
erase(begin,end) 删除begin到end之间的元素
erase(iterator) 删除迭代器所指向的元素
#include <iostream> #include <cstdio> #include <set> using namespace std; set<int>s; int num[]={2,1,3,4,6,10}; int main() { s.insert(num,num+6); //第一种方式 s.erase(1); for(set<int>::iterator p=s.begin();p!=s.end();++p) printf("%d ",*p); puts(""); //第二种方式 set<int>::iterator Begin=s.begin() ,End=s.end(); ++Begin ,--End ; s.erase(Begin,End); for(set<int>::iterator p=s.begin();p!=s.end();++p) printf("%d ",*p); puts(""); //第三种方式 s.erase(s.find(2)); for(set<int>::iterator p=s.begin();p!=s.end();++p) printf("%d ",*p); puts(""); return 0; }
五.常用函数
begin() rend() 返回set的初始地址
end() rbegin() 返回set的结束地址
clear() 清空set
size() 返回set中元素个数
empty() 判断set是否为空。若为空,返回true
六.遍历
使用迭代器iterator
for(set<int>::iterator p=s.begin();p!=s.end();++p)
相关文章推荐
- 类中const, static, reference成员的初始化
- 类中的常量, const对象和成员函数
- Asp.Net_DataGridView的CRUD带分页
- 怎样修复Windows 10 Enterprise 在9月更新后图片全部由绘图板打开的情况
- 让你不再害怕指针
- rac安装GI时运行root.sh报错
- tachyon与hdfs,以及spark整合
- 一般处理程序返回json
- nodejs优化
- 如何解决老毛桃PE系统自动安装360
- tachyon与hdfs,以及spark整合
- HDU 5439 Aggregated Counting
- 限制文本框输入指定字符
- c# yield
- iOS开发:利用SDWebImage实现图片加载与缓存
- C/C++中的输入与输出及如何读取一行文本
- Android开发时你遇到过什么相见恨晚的工具或网站?
- C/C++中的void和void*
- Asp.Net_button样式对不齐
- Asp.Net_WebFrom