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 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...
随机推荐
- day03_雷神_文件操作
day03 上周回顾_问题总结: 地址值: li = [] name = ['name','price','count'] dic = {} #如果这里定义空列表,后边的dic[name[i]] = ...
- [javascript-debug-ajax-json]两种不同的json格式数据
Bug 1: 1. 这里面的 data 只是一维数组{"state":0,"errorCode":0,"data":{"origi ...
- linux上安装python2.7.11
好久不玩儿linux了,本来就不熟,现在几乎白痴.步骤如下: 从python官网上下载python的源代码 tar zvxf后得到一个文件夹: 进入Python-2.7.11,按照https://do ...
- (zxing.net)二维码Aztec的简介、实现与解码
一.简介 Aztec Code是1995年,由Hand HeldProducts公司的Dr. Andrew Longacre设计.它是一种高容量的二维条形码格式.它可以对ASCII和扩展ASCII码进 ...
- WPF 右上角带数字的按钮
效果如图所示 三种方案, 1:不改控件模版,布局实现,死开 2:改button模版,利用附加属性,附加附加属性,功能多了话,不利于拓展 3:继承button,添加依赖属性,接下来是这种 1:新建类 为 ...
- 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar
[源码下载] 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar 作者:webabcd 介绍背水一战 Windows 10 之 控件(导航类) App ...
- 初识node.js(通过npm下载项目依赖的包的过程)
一.初识node.js 简单的说Node.js 就是运行在服务器端的JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事 ...
- lua 源码阅读顺序
https://www.reddit.com/comments/63hth/ask_reddit_which_oss_codebases_out_there_are_so/c02pxbp Online ...
- drf-视图的理解
1. 类视图 写视图的步骤: 1. 数据库查询, 2. 构建序列化器, 进行序列化操作, 返回数据 一. 两大基类 >1 APIView (以常规的方法实现get po ...
- Vue 项目配置
配置Vue的app项目首先需要配置本地环境. 1.下载node.js并且安装.(根据自己电脑参数进行选择) 打开cmd,检查是否安装成功. 分别输入: node -v npm -v 结果如图正确显示出 ...