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

  1. C++STL之multiset多重集合容器

    multiset多重集合容器 multiset与set一样, 也是使用红黑树来组织元素数据的, 唯一不同的是, multiset允许重复的元素键值插入, 而set则不允许. multiset也需要声明 ...

  2. multiset多重集合容器

    跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入.元素的搜索依旧具有对数级的算法时间复杂度,find和equal_ra ...

  3. Multiset ------ 多重集合

    Multiset的中文名是多重集合,其实就是集合的扩展版.唯一的不同是集合中一个值只能出现一次,而多重集合中一个值可以出现多次. 粗略看了看MSDN,在STL中,multiset和set的成员函数声明 ...

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

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

  5. multiset基础学习,可以有重复类型的多重集合容器

    #include <set> #include <iostream> using namespace std; struct Student { char *name; int ...

  6. C++STL之set集合容器

    set集合容器 set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构, 在 插入元素时, 它会自动调整二叉树的排列, 把该元素放到适当的位置, 以确保每个子树根节点的键 ...

  7. set集合容器(常用的使用方法总结)

     关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. 构造set集合容器的目的是为了去重+排序+快速搜索.由于set集合容器实现了红黑树多的平衡二叉检索树的数据结构,在插 ...

  8. multimap多重映照容器(常用的方法总结)

    multimap和map的不同之处在于前者允许重复键值的元素出现. /*关于C++STL中mulitmap的学习,与map不同的是,multimap允许插入重复键值的元素*/ #include < ...

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

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

随机推荐

  1. 第三天:JavaScript的DOM对象和DOM操作HTML

    1. DOM操作HTML 1)注意:绝对不要在文档加载完成之后使用docment.write().这样会覆盖原来的文档 <body> <p>hello</p> &l ...

  2. 【.NET架构】BIM软件架构02:Web管控平台后台架构

    一.前言        之前一篇叙述的是Revit插件(桌面软件)的软件架构,本篇将开始叙述Web项目的架构方案.今年一月在老东家加入BIM平台部门,为一些大型国家项目搭建BIM管控平台,业主使用管控 ...

  3. Button去除边框方法

    <Button  Content="Button" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey} ...

  4. BZOJ百题版切计划(不咕)

    传送门 BZOJ 前言 听说最近要省选,那么我就写一下吧.QwQ! 1000 过于简单,不写了. 1001 不会对偶图,直接优化最小割 题解 1002 高精度套公式计算 题解 (Code by hey ...

  5. 【BZOJ3160】 万径人踪灭(FFT,manacher)

    前言 多项式真的很难♂啊qwq Solution 考虑求的是一个有间隔的回文串,相当于是: 总的答案-没有间隔的答案 考虑总的答案怎么计算?FFT卷一下就好了. 对于每一位字符,有两种取值,然后随便卷 ...

  6. 分组,命名分组,url的命名和反向解析

    1.位置分组 匹配到参数,按照位置参数的方式传递给视图函数 视图函数需要定义形参接收变量 1.写在url里面的: # 删除 url(r'^del_class/(\d+)',views.del_clas ...

  7. Python之分支结构

    if lengeh >= 100: #每个条件后面要使用冒号 if lengeh>=10000: ") elif lengeh>=1000: ') else: pass e ...

  8. 基于iview的后台管理

    年前由于时间紧迫,原本使用iview技术开发后台管理系统的大神另有任务,我中途接手该项目,此前对于iview一无所知的我是一脸的懵逼,好在后台管理的整体框架大神已经搭建好了,而我之前对vue也有一定的 ...

  9. Python小白学习之路(二十五)—【装饰器的应用】

    通过一个任务来加深对装饰器的理解和应用 回顾:装饰器的框架 def timmer(func): def wrapper(): func() return wrapper 任务:给以下正在运行的程序加一 ...

  10. ASP.NETCore学习记录(二) —— ASP.NET Core 中间件

    ASP.NET Core 中间件 目录: 什么是中间件 ? IApplicationBuilder 使用 IApplicationBuilder 创建中间件 Run.Map 与 Use 方法 实战中间 ...