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 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...
随机推荐
- SRM481
250pt 题意:上帝知道一个“先有鸡还是先有蛋”的答案,上帝和N<=10^6个人说了答案,不过有x个人故意告诉了他们错误的答案,然后有一个人问了这N个人问题的答案,有M个人说先有鸡,N-M个人 ...
- CxGrid鼠标移到更改颜色
CxGrid鼠标移到更改颜色 设置表单中TcxGrid1DBTableView的Styles属性,设置Selection procedure TForm1.cxGrid1DBTableView1Mou ...
- QuartzNet使用
quartz.config # You can configure your scheduler in either <quartz> configuration section # or ...
- hadoop 的HDFS 的 standby namenode无法启动事故处理
standby namenode无法启动 现象:线上使用的2.5.0-cdh5.3.2版本Hadoop,开启了了NameNode HA,HA采用QJM方式.hadoop的集群的namenode的sta ...
- Android SDK Mangaer 需要下载的组件
以 Windows 下为例,安装完 Android SDK 后,可以看到 SDK 的目录结构如下: 其中: SDK Manager.exe 是 Android SDK 的管理工具, AVD Manag ...
- [翻译] ASP.NET WebAPI 中的异常处理
原文链接:https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/exception-handling 本文介绍 ...
- .net 使用HtmlAgilityPack做爬虫
HtmlAgilityPack官网:https://html-agility-pack.net/?z=codeplex .net中使用HtmlAgilityPack做爬虫步骤: 1.在nuget中安装 ...
- sharepoint support ashx file
Hello, I did the steps from the tutorial you are using. I have received the same error when I did no ...
- 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈
剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...
- 「PKUSC2018」主斗地(暴搜)
这道斗地主比 \(PKUWC\) 那道可做多了... 我们用 \(NOIP\) 那道斗地主的思路:暴搜出三代和四代,贪心出散牌. 还有jry为什么要出xx网友而不出他的另一个老婆 我们发现两个人的每回 ...