multiset多重集合容器(常用的使用方法总结)
关于C++STL中multiset集合容器的学习,看别人的代码一百遍,不如自己动手写一遍。
multiset多重集合容器和set集合容器的使用方法大多相同,不同的是multiset多重集合容器允许重复的元素键值插入。
#include <set>
#include <string>
#include <iostream>
using namespace std; struct myComp{
bool operator () (const string &a,const string &b){
if(a.compare(b) == )
return ;
return ;
}
}; struct STUDENT{
string name;
double score;
//重载"<"运算符,自定义排列规则
bool operator < (const STUDENT &a) const{
return a.score<score;//由大到小。如果由小到大,则符号为>
}
}; void print(multiset<string> ms);
void rprint(multiset<string> ms); int main()
{
//多重集合的创建与插入
multiset<string> ms;
ms.insert("abc");
ms.insert("");
ms.insert("");
ms.insert("aaa");
ms.insert("");
cout<<"中序正向遍历:\n";
print(ms);
cout<<"中序逆向遍历:\n";
rprint(ms);
/*运行结果
中序正向遍历:
111
123
123
aaa
abc
中序逆向遍历:
abc
aaa
123
123
111
*/ //元素的查找
/*同set集合容器一样,使用find()查找元素,如果找到返回钙元素的迭代器位置(如果该元素存在重复,则返回第
一个重复元素的迭代器位置),否则,返回end()迭代器*/
multiset<string>:: iterator it;
it=ms.find("");
if(it != ms.end()) cout<<"找到键值为123的元素\n";
it=ms.find("");
if(it == ms.end()) cout<<"没有找到键值为456的元素\n";
/*运行结果
找到键值为123的元素
没有找到键值为456的元素
*/ //多重集合元素的删除
cout<<"删除前:\n";
print(ms);
int n=ms.erase("");//删除键值等于某个值得所有重复元素,并返回删除元素的个数
cout<<"删除了"<<n<<"个元素\n";
cout<<"删除后:\n";
print(ms);
/*运行结果
删除前:
111
123
123
aaa
abc
删除了2个元素
删除后:
111
aaa
abc
*/ ms.clear();
if(ms.empty()) cout<<"清除后为:空\n";
/*运行结果
清除后为:空
*/ /*同样在使用insert()可以采用自定义比较函数,默认从小到大*/
//当元素类型是基本数据类型时,采用在主函数前重载"()"操作符
multiset<string,myComp> mss;
mss.insert("abc");
mss.insert("");
mss.insert("");
mss.insert("aaa");
mss.insert(""); multiset<string>::iterator it1;
for(it1= mss.begin(); it1 != mss.end(); it1 ++){
cout<<*it1<<endl;
}
/*运行结果
abc
aaa
123
123
111
*/ //如果元素是结构体,可以将比较函数写在结构体内,见main函数之前的定义方法
multiset<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); someone.name="Nacy";
someone.score=60.5;
students.insert(someone); multiset<STUDENT>:: iterator it2;
for(it2 = students.begin(); it2 != students.end(); it2 ++){
cout<<(*it2).name<<":"<<(*it2).score<<endl;
}
/*运行结果
Jack:80.5
Nacy:60.5
Nacy:60.5
Tomi:57.5
*/
return ;
} void print(multiset<string> ms)
{
multiset<string>:: iterator it;
for(it=ms.begin(); it != ms.end(); it ++){
cout<<*it<<endl;
}
} void rprint(multiset<string> ms)
{
multiset<string>::reverse_iterator rit;
for(rit=ms.rbegin(); rit != ms.rend(); rit++){
cout<<*rit<<endl;
}
}
multiset多重集合容器(常用的使用方法总结)的更多相关文章
- C++STL之multiset多重集合容器
multiset多重集合容器 multiset与set一样, 也是使用红黑树来组织元素数据的, 唯一不同的是, multiset允许重复的元素键值插入, 而set则不允许. multiset也需要声明 ...
- multiset多重集合容器
跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入.元素的搜索依旧具有对数级的算法时间复杂度,find和equal_ra ...
- Multiset ------ 多重集合
Multiset的中文名是多重集合,其实就是集合的扩展版.唯一的不同是集合中一个值只能出现一次,而多重集合中一个值可以出现多次. 粗略看了看MSDN,在STL中,multiset和set的成员函数声明 ...
- 【STL】 set集合容器常用用法
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值:另外,还 ...
- multiset基础学习,可以有重复类型的多重集合容器
#include <set> #include <iostream> using namespace std; struct Student { char *name; int ...
- C++STL之set集合容器
set集合容器 set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构, 在 插入元素时, 它会自动调整二叉树的排列, 把该元素放到适当的位置, 以确保每个子树根节点的键 ...
- set集合容器(常用的使用方法总结)
关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. 构造set集合容器的目的是为了去重+排序+快速搜索.由于set集合容器实现了红黑树多的平衡二叉检索树的数据结构,在插 ...
- multimap多重映照容器(常用的方法总结)
multimap和map的不同之处在于前者允许重复键值的元素出现. /*关于C++STL中mulitmap的学习,与map不同的是,multimap允许插入重复键值的元素*/ #include < ...
- map映照容器(常用的使用方法总结)
map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习,看 ...
随机推荐
- bootstrap4相关文档
本节课我们主要学习一下Bootstrap的两个个组件功能:输入框组件和导航导航条组件. 一.输入框组件 文本输入框就是可以在<input>元素前后加上文字或按钮,可以实现对表单控件的扩 展 ...
- robotium测试创建java文件和junit文件区别
两者本身差别不大,只是构造方式不同,我一般都用java文件来创建. 1.当有源码测试时,创建junit测试文件 ActivityInstrumentationTestCase2<T>T可以 ...
- 在CentOS上安装GITLAB
为什么要用gitlab? 方便地管理项目,设置用户权限. 参考 https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md 步 ...
- Delphi获取公网IP地址函数
uses IdHTTP; function GetPublicIP: string; var strIP, URL: string; iStart, iEnd: Integer; MyIdHTTP: ...
- Gimp RGB 转 CMYK
安装GIMP separate+插件.在Windows的Photoshop中,有转换CMYK的功能,非常简单.在Linux里,通常用GIMP进行转换.由于授权的问题,默认安装的GIMP里没有安装转换的 ...
- 利用 Azure Devops 创建和发布 Nuget 包
利用 Azure Devops 创建和发布 Nuget 包 原 Visual Studio Team Service ,简称 VSTS,能够创建 pipelines 管道以构建应用程序,并将其部署到任 ...
- Quartz是一个任务调度
这段时间做一个案子,用到每天定时处理事件,之前的解决思路是通过一个定时器轮询时间段,这样不能精准的在某个时间戳上执行动作.由于没有用过Quartz是一个任务调度,一直使用这个办法,今天通过同事提点,从 ...
- Android逆向进阶—— 脱壳的奥义(基ART模式下的dump)
本文作者:i春秋作家HAI_ZHU 0×00 前言 市面上的资料大多都是基于Dalvik模式的dump,所以这此准备搞一个ART模式下的dump.HAI_的使用手册(各种好东西) Dalvik模式是A ...
- graphite custom functions
尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6522854.html 参考 https://graphite.readthedocs.io ...
- 深度学习环境配置:Ubuntu16.04下安装GTX1080Ti+CUDA9.0+cuDNN7.0完整安装教程(多链接多参考文章)
本来就对Linux不熟悉,经过几天惨痛的教训,参考了不知道多少篇文章,终于把环境装好了,每篇文章或多或少都有一些用,但没有一篇完整的能解决我安装过程碰到的问题,所以决定还是自己写一篇我安装过程的教程, ...