set集合容器(常用的使用方法总结)
关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍。
构造set集合容器的目的是为了去重+排序+快速搜索。由于set集合容器实现了红黑树多的平衡二叉检索树的数据结构,在插入或者删除是,均能自动调整二叉树,使得二叉树始终保持新的平衡。除set外,multiset,map,multimap的内部结构也是平衡二叉树。
/*关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍。
set集合容器的主要目的是为了加快检索,当有某种数据类型需要去重加排序的时候,使用起来去重非常方便,
而且查找效率非常高。
*/
#include <set>//头文件,与multiset相同
#include <iostream>
using namespace std; //自定义比较函数myComp,重载"()"操作符
struct myComp{
bool operator () (const int &a,const int &b){
return a>b;//由大到小
}
}; //直接将比较函数写在结构体内
struct STUDENT{
string name;
double score; //重载"<"操作符,自定义排列规则
bool operator < (const STUDENT &a) const{
//按score由大到小排列。如果由小到大排列,使用">"号即可
return a.score < score;
}
}; void print(set<int> s);
void rprint(set<int> s); int main()
{
/*创建set集合对象,格式为set<元素类型> 集合对象标识符*/
set<int> s;//定义了一个元素类型为int的集合对象s,当前没有任何元素 /*元素的插入和遍历(对平衡二叉检索树的中序遍历)*/
//插入过程也是排序过程,排序采用默认的比较规则,使得set集合的数据结构始终保持平衡二叉检索树
//也可以自定义比较规则函数
s.insert();//第一次插入8,可以插入
s.insert();
s.insert();
s.insert();
s.insert();//第二次插入8,重复元素,不可以插入,从而达到去重的效果 //中序正向遍历集合中的所有元素
set<int>::iterator it;//定义前向迭代器
for(it=s.begin(); it != s.end(); it++){
cout<<*it<<' ';
}
cout<<endl;
/*运行结果
1 6 8 12
*/
//中序反向遍历集合中的所有元素
set<int>::reverse_iterator rit;
for(rit=s.rbegin(); rit != s.rend();rit++){
cout<<*rit<<' ';
}
cout<<endl;
/*运行结果
12 8 6 1
*/ /*要想检索集合中是否存在等于某个键值的元素,则使用find()方法,如果找到则返回该键值的迭代器位置,
否则,返回集合最后一个元素后面的一个位置,即end()*/
set<int>::iterator it1;//定义迭代器接收find()方法的返回值
it1=s.find();
if(it1 != s.end())
cout<<"找到键值为 "<<*it1<<"的元素\n";
it1=s.find();
if(it1 == s.end())
cout<<"没有找到键值为 1的元素\n";
/*运行结果
找到键值为 12的元素
没有找到键值为 1的元素
*/ /*元素的删除*/
//要想删除等于某个键值时,使用erase()方法
cout<<"删除前:\n";
print(s);
s.erase();//删除键值为6这个元素
cout<<"删除后:\n";
print(s);
/*运行结果
删除前:
1 6 8 12
删除后:
1 8 12
*/ //要想清空集合
cout<<"清空前:\n";
print(s);
s.clear();
cout<<"清空后:\n";
print(s);
/*运行结果
清空前:
1 8 12
清空后: */ /*注意使用insert()将元素插入到集合中去的时候,集合会根据设定的比较函数将元素放到相应的结点上。当没有制定比较
函数的时候采用默认比较函数,即按键值由小到大的顺序插入*/ /*插入时编写比较函数的两种方法*/
//如果元素是基本数据类型,见main函数之前的定义方法
set<int,myComp> ss;
ss.insert();//同样,第一次插入,第二次重复元素不插入
ss.insert();
ss.insert();
ss.insert(); set<int,myComp>::iterator it2;//定义同元素类型的前向迭代器
for(it2=ss.begin(); it2 != ss.end(); it2++){
cout<<*it2<<' ';
}
cout<<endl;
/*运行结果
12 8 6 1
*/ //如果元素是结构体,可以将比较函数写在结构体内,见main函数之前的定义方法
set<STUDENT> students;
STUDENT someone;
someone.name="Jack";
someone.score=80.5;
students.insert(someone); someone.name="Tomi";
someone.score=57.5;
students.insert(someone); someone.name="Nacy";
someone.score=60.5;
students.insert(someone); set<STUDENT>::iterator it3;//定义前向迭代器
for(it3=students.begin(); it3 != students.end();it3 ++){
cout<<(*it3).name<<":"<<(*it3).score<<endl;
}
/*运行结果
Jack:80.5
Nacy:60.5
Tomi:57.5
*/
return ;
} void print(set<int> s)
{
set<int>::iterator it;//定义前向迭代器
for(it=s.begin(); it != s.end(); it++){
cout<<*it<<' ';
}
cout<<endl;
} void rprint(set<int> s)
{
set<int>::reverse_iterator rit;//定义反向迭代器
for(rit=s.rbegin(); rit != s.rend();rit++){
cout<<*rit<<' ';
}
cout<<endl;
}
set集合容器(常用的使用方法总结)的更多相关文章
- 【STL】 set集合容器常用用法
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...
- multiset多重集合容器(常用的使用方法总结)
关于C++STL中multiset集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. multiset多重集合容器和set集合容器的使用方法大多相同,不同的是multiset多重集合容器允许重复 ...
- map映照容器(常用的使用方法总结)
map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习,看 ...
- Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- SVG DOM常用属性和方法介绍(1)
12.2 SVG DOM常用属性和方法介绍 将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析 ...
- [转载]Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- SERVLET类常用接口及方法
SERVLET类常用接口及方法 2011-09-09 16:14:43 [size=xx-small]SERVLET类常用接口及方法2007年04月05日 星期四 04:46 P.M.基本类和接 ...
- 面霸篇:Java 集合容器大满贯(卷二)
面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...
随机推荐
- 转:log4j的使用简介
spring使用log4j,可以有2种方法. 1.在web.xml里不做任何配置. log4j.properties放在classpath根目录下, 这时候生成的日志文件就没有相对路径,如果写相对路径 ...
- http://vjudge.net/contest/view.action?cid=51142#problem/C 精度转换的一道题。。。
C - Get-Together at Den's Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & ...
- 工作随笔——pinpoint分布式性能监控工具(docker安装)
在做性能压测的时候,你是不是有只能看到测试报告? 在做性能压测的时候,你是不是想知道每一个方法执行了多长时间? Pinpoint几乎可以帮助你查看你想看到的每一个细节. Pinpoint是什么? Pi ...
- VS2010的快捷键乱
vs2010的快捷键乱了,点击回车会出现属性窗口,点击退格键会相当于编辑里面的撤销功能 点击ctrl+s会出现sharepoint窗口,在网上找了一个解决方式(很难找),原问在这: http://q. ...
- WPF ListBox的进阶使用(一)
公司项目有个需求,UI界面支持动态平均分割界面,想了想便想到用ListBox来实现,用UniformGrid作为ListBox的ItemsPanelTemplate,通过动态改变UniformGrid ...
- 【转】TOP10美国虚拟主机/网站空间推荐
原文:http://www.laozuo.org 不同的站长用户需要不同的主机产品,并不是所有的站长, 所有的网站都想放置在VPS服务器中的.虚拟主机也有虚拟主机的方便和优势,下面为老左精选的10个比 ...
- 网络流——最大流Dinic算法
前言 突然发现到了新的一年什么东西好像就都不会了凉凉 算法步骤 建残量网络图 在残量网络图上跑增广路 重复1直到没有增广路(注意一个残量网络图要尽量把价值都用完,不然会浪费建图的时间) 代码实现 #i ...
- Android Dagger 2 无法自动生成 Dagger Component
给项目升级 gradle(3.0)和 build(27)后发现 Dagger 2 无法自动生成 Dagger Component 类了. 原因竟是我把 : kapt 'com.google.dagge ...
- web开发常用网络优化
优化方法: 1.合并资源文件,减少HTTP请求 2.压缩资源文件减少请求大小 3.利用缓存机制,尽可能使用缓存减少请求 如何做前端路由 html5 api中的history能够让我们控制url跳转之后 ...
- 转---写一个网页进度loading
作者:jack_lo www.jianshu.com/p/4c93f5bd9861 如有好文章投稿,请点击 → 这里了解详情 loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在 ...