跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入。元素的搜索依旧具有对数级的算法时间复杂度,find和equal_range函数能够搜索出某一键值下的全部元素位置。

创建multiset对象

有下面几种方式。

(1)    multiset()

multiset<int> ms;

(2)    multiset(constkey_compare&cmp)

//student结构体

structstudent{

int id;

char *name;

};

//比較函数

structstuLess{

bool oprator()(const student &s1,conststudent &s2){

return s1.id<s2.id;

}

};

//创建multiset对象

multiset<student,stuLess> ms(stuLess);

(3)    multiset(const multiset&)

//multiset<int> ms1;

multiset<int> ms2(ms1);

(4)    miltiset(InputIteratorfirst,InputIterator last)

int array[]={1,2,3,4,5};

multiset<int> ms(array,array+5);

(5)    miltiset(InputIteratorfirst,InputIterator last, const key_compare&cmp)

student stuArray[]={{1,”li”},{2,”shi”},{3,”wang”}};

multiset<student,stuLess> ms(stuArray,stuArray+3,stuLess());

插入

multiset的插入函数与set类似,一般用insert。有三种形式。

(1)    iterator insert(constvalue_type&v)

(2)    iterator insert(iterator pos, constvalue_type&v)

(3)    void insert(InputIteratorfirst,InputIterator last)

删除

multiset的元素删除与set容器的删除全然一致,主要是erase和clear函数。

遍历

利用迭代器进行遍历訪问元素。

#include<iostream>
#include<set>
using namespace std;
int main()
{
multiset<int> ms;
//无序输入
ms.insert(1);
ms.insert(21);
ms.insert(11);
ms.insert(10);
ms.insert(9);
ms.insert(9);
multiset<int>::iterator begin,end;
end=ms.end();
for(begin=ms.begin();begin!=end;begin++)
{
cout<<*begin<<" ";//有序输出
}
cout<<endl;
return 0;
}

反向遍历

利用反向迭代器reverse_iterator和const_reverse_iterator进行反向迭代,降序输出。

#include<iostream>
#include<set>
using namespace std;
int main()
{
multiset<int> ms;
ms.insert(1);
ms.insert(1);
ms.insert(5);
ms.insert(4);
ms.insert(1);
multiset<int>::reverse_iterator rbegin,rend;
rend=ms.rend();
for(rbegin=ms.rbegin();rbegin!=rend;rbegin++)
{
cout<<*rbegin<<" ";
}
cout<<endl;
return 0;
}

元素的搜索

find函数返回第一个搜索到的元素的位置,假设元素不存在,则返回end结束元素位置。

equal_range函数则返回一个能够指示相等元素范围区间的pair对象。原型例如以下:

(1)    iterator find(constkey_type&k)

(2)    pair<iterator,iterator>equal_range(constkey_type&k)

返回一个pair对象。其first变量值为lower_bound(k),second变量值为upper-bound(k),分别指向大于等于k(x>=k)和大于k(x>k)的第一个元素位置。即给出相等元素的位置范围。

#include<iostream>
#include<set>
using namespace std;
int main()
{
multiset<int> ms;
ms.insert(11);
ms.insert(21);
ms.insert(10);
ms.insert(11);
ms.insert(11);
ms.insert(11);
ms.insert(9);
int v=9;
multiset<int>::iterator i_v=ms.find(v);
cout<<*i_v<<endl;
v=11;
pair<multiset<int>::iterator,multiset<int>::iterator>p=ms.equal_range(v);
cout<<"大于等于"<<v<<"的第一个元素为"<<*p.first<<endl;
cout<<"大于"<<v<<"的第一个元素为"<<*p.second<<endl;
//打印反复键值元素11
multiset<int>::iterator i;
cout<<"键值为"<<v<<"的全部元素为";
for(i=p.first;i!=p.second;i++)
{
cout<<*i<<" ";
}
return 0;
}


其它函数

其它经常使用的函数有empty、size、count、lower_bound、upper_bound等。

multiset多重集合容器的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. C++ STL set集合容器

    汇总了一些set的常用语句,部分参考了这篇:http://blog.163.com/jackie_howe/blog/static/199491347201231691525484/ #include ...

  7. Codeforces Round #523 (Div. 2) D. TV Shows 模拟(多重集 先把所有区间加入多重集合)+贪心+二分

    题意:给出n个电视节目的起始和结束时间  并且租一台电视需要x +y*(b-a)  [a,b]为时段 问完整看完电视节目的最小花费是多少 思路:贪心的思想 情况1 如果新租一台电视的花费<=在空 ...

  8. python 标准类库-数据类型之集合-容器数据类型

    标准类库-数据类型之集合-容器数据类型   by:授客 QQ:1033553122 Counter对象 例子 >>> from collections import Counter ...

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

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

随机推荐

  1. Blender插件之Panel

    目标 [x] 总结Blender之Panel 总结 Blender之Panel需要从Blender界面组成开始理解. 直观上Blender的界面层次为 Editors ‣ Regions ‣ (Tab ...

  2. Django之缓存机制

    1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次 ...

  3. express jade ejs 为什么要用这些?

    express是快速构建web应用的一个框架   线上文档 http://www.expressjs.com.cn/ 不用express行不行呢?    看了网上的回答:不用express直接搭,等你 ...

  4. 决策实验(2)分水岭&哄骗实验

    转载请注明http://www.cnblogs.com/igoslly/p/6824544.html 史密斯实验II PART I 分水岭实验 两种选项 A 50%没钱,50% 45元 B 获取固定数 ...

  5. matlab中的@函数

    原文链接:http://blog.sina.com.cn/s/blog_5e73a8fc0100t9yg.html 这是个函数句柄 @(x,y) 表示未知数是x和y punct     - Funct ...

  6. 00--Qt Creator 你必须要掌握的快捷操作

    Qt Creator 你必须要掌握的快捷操作 多使用快捷键能显著提高工作效率,尽可能减少键盘,鼠标之间切换所浪费的时间.我这里列出个人认为非常重要必须掌握的 Qt Creator 快捷键.看你知道几个 ...

  7. Github 团队协作基本流程与命令操作 图解git工作流程

    # 先 fork 项目到自己 github # 1. 从自己仓库克隆到本地(clone 的是项目指定的默认分支,比如 master) git clone git@github.com:me/em.gi ...

  8. 路飞学城Python-Day181

    Evernote Export Nginx默认网站 当Nginx配置文件中有且仅有一个Server的时候,该Server就被Nginx认为是默认网站,所有发给Nginx服务器80端口的数据都会默认给s ...

  9. MySQL py模块的链接Navicat可视化工具

     数据库可视化工具Navicat 1 基本操作: 1 库 表 字段 记录(增删改查) 2 添加主建,添加自增. 3 添加外键,外键的链接 4 模型建表,模型添加外键.(逆向数据库到模型,运行SQL文件 ...

  10. [总结-动态规划]经典DP状态设定和转移方程

    马上区域赛,发现DP太弱,赶紧复习补上. #普通DP CodeForces-546D Soldier and Number Game 筛法+动态规划 待补 UVALive-8078 Bracket S ...