关于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集合容器(常用的使用方法总结)的更多相关文章

  1. 【STL】 set集合容器常用用法

    set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...

  2. multiset多重集合容器(常用的使用方法总结)

    关于C++STL中multiset集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. multiset多重集合容器和set集合容器的使用方法大多相同,不同的是multiset多重集合容器允许重复 ...

  3. map映照容器(常用的使用方法总结)

    map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习,看 ...

  4. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  5. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

  6. SVG DOM常用属性和方法介绍(1)

    12.2  SVG DOM常用属性和方法介绍 将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析 ...

  7. [转载]Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  8. SERVLET类常用接口及方法

    SERVLET类常用接口及方法 2011-09-09 16:14:43    [size=xx-small]SERVLET类常用接口及方法2007年04月05日 星期四 04:46 P.M.基本类和接 ...

  9. 面霸篇:Java 集合容器大满贯(卷二)

    面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...

随机推荐

  1. AngularJS 控制器 Live Dom

    控制器的作用是在$scope对象上创建属性和方法,控制器的作用域是$scope,所以作用域是针对控制器来讲的.另外,控制器实例不是单例,每次都会重新实例化,不像服务是单例的. 其是注册在模块上的,如 ...

  2. 2.Handler处理器 和 自定义Opener

    Handler处理器 和 自定义Opener opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构 ...

  3. CocoaPods的使用(一) 安装

    一.什么是CocoaPods? 前言: 思考如何引入一个第三方框架. 例如: 百度地图SDK.友盟.ShareSDK. 信鸽推送等. 从github或某处下载第三方SDK 工程中导入所需要的SDK的文 ...

  4. 简谈Entity Framework的优缺点

    Entity Framework简介 Entity Framework的全称为 ADO.NET Entity Framework ,简称为EF, 是微软以ADO.NET为基础发展出来的实体框架,早期被 ...

  5. Spring AOP 源码分析系列文章导读

    1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...

  6. BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)

    2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1128  Solved: 414[Submit] ...

  7. ReactNatvie遇到的错误

    1:新版的React包中没有包含PropTypes,如果使用需要从‘prop-types’包中导入. 2: 'prop-types'包中直接定义‘PropTypes.style’是无效的,需要使用‘P ...

  8. Android必学之AsyncTask

    AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程. .为什么需要使用异步任务 ...

  9. git小乌龟工具TortoiseGit记住你的账号密码

    在使用TortoiseGit的过程中,发下每次push或者pull都要重复输入账号密码,非常麻烦 怎么设置记住密码 在[系统盘]:\Users[你的用户名](比如C:\User\Administrat ...

  10. 文件压缩小项目haffman压缩

    文件压缩的原理: 文件压缩总体可以分为有损压缩和无损压缩两类,有损压缩是指对mp3等格式的文件,忽略一些无关紧要的信息,只保留一些关键的信息,但并不因此影响用户对于这些mp3格式文件的体验度,无损压缩 ...