set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。

下面介绍set的常用操作:

1:注意包含头文件<set>

set只有自加和自减运算!!!

s.begin()    返回set容器的第一个元素的地址

s.end()    返回set容器的最后一个元素之后的地址

s.clear()   删除set容器中的所有的元素

s.empty()    判断set容器是否为空

s.insert()   插入一个元素

s.erase()   删除一个元素

s.size()      返回当前set容器中的元素个数

具体看代码:

#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;//创建一个set对象
for(int i=;i<;i++)
s.insert(i+);//插入三个元素,10 11 12
cout<<*s.begin()<<endl;//输出第一个元素10
cout<<*(--s.end())<<endl;//输出最后一个元素
s.erase(s.begin());//删除第一个元素
cout<<*s.begin()<<endl;//第一个元素变为11
cout<<s.size()<<endl;//答案为2
s.clear();//清空所有元素
cout<<s.size()<<endl;//输出为0
return ;
}

迭代器的使用:

#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;//创建一个set对象
for(int i=;i<;i++)
s.insert(i+);//插入三个元素,10 11 12
set<int>::iterator it;//创建一个迭代器
for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历
cout<<*it<<" ";
cout<<endl;
it=s.begin();
it++;
s.erase(it);//用迭代器进行删除操作
for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历
cout<<*it<<" ";
cout<<endl;
return ;
}

修改:不能修改容器内数据,所以只能删除某元素再插入要修改的数值

查找:s.find()

如果容器内不存在该元素,返回值等于s.end();

#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;//创建一个set对象
for(int i=;i<;i++)
s.insert(i+);//插入三个元素,10 11 12
set<int>::iterator it;//创建一个迭代器
for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历
cout<<*it<<" ";
cout<<endl;
if(s.find()!=s.end()) cout<<"yes"<<endl;
return ;
}

set的其它常用操作:

s.lower_bound() 返回第一个大于或等于给定关键值的元素

s.upper_bound() 返回第一个大于给定关键值的元素

s.equal_range() 返回一对定位器,分别表示 第一个大于或等于给定关键值的元素 和 第一个大于给定关键值
的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于
s.end()

#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;//创建一个set对象
for(int i=;i<;i++)
s.insert(i+);//插入三个元素,10 11 12
cout<<*s.lower_bound()<<endl;//输出10
cout<<*s.upper_bound()<<endl;//输出11
cout<<*s.equal_range().first<<endl;//
cout<<*s.equal_range().second<<endl;//
return ;
}

如果要把set定义为降序:可以如下定义:

#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int,greater<int> >s;
for(int i=;i<;i++)
s.insert(i+);
set<int>::iterator it;
//降序输出
for(it=s.begin();it!=s.end();it++) cout<<*it<<endl;
return ;
}

最新文章

  1. Java_I/O输入输出_实现读取文件时出现一个表示读取进度的进度条。可以使用java.swing包提供的输入流类ProgressMonitorInputStream
  2. mac工具收藏
  3. ubuntu 下建立桌面快捷方式
  4. jdbc:java数据库连接
  5. [Angular 2] Handle Reactive Async opreations in Service
  6. HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)
  7. Centos7 Yum方式安装Mysql7
  8. 并发编程(二):分析Boost对 互斥量和条件变量的封装及实现生产者消费者问题
  9. Django中数据库表的关联与创建(语言:python)
  10. svn 解决冲突
  11. scrollTo不起作用
  12. Pycharm使用技巧(转载)
  13. 终于有人把“TCC分布式事务”实现原理讲明白了!
  14. .NET Core 实践一:微服务架构的优点(转)
  15. Thinking-Bear magic (计算几何)
  16. 实用ExtJS教程100例-005:自定义对话框Ext.MessageBox.show
  17. 【加密算法】MD5
  18. JAVA实验一20145315
  19. 触摸事件【MotionEvent】简介
  20. NLPIR

热门文章

  1. jquery 使用记录
  2. 数据结构--树--AVL树
  3. C++面试笔记--STL模板与容器
  4. TinkerPop中的遍历:图的遍历步骤(2/3)
  5. FineUI从iis6迁移到iis7.5上遇到的奇葩事情
  6. 哈雷监控设备的操作及升级NSG9k6G
  7. 使用pip安装离线包
  8. curl抓取网页内容php
  9. Eclipse中使用Spring IOC容器的具体方法
  10. Leetcode 283. Move Zeroes 移动数组中的零 (数组,模拟)