C++ 多重集的使用

多重集当中的数据映射关系将不是前面的一对一的关系,而是一对多,也就是可以在容器当中插入具有相同key的实例。关于组织方式,LZ进行了下面的大胆的预测。

第一、底层的数据组织方式如果是红黑树,那么就会将具有相同key的数据连续存放,也就是在红黑树的中序遍历中他们是挨着的。

第二、如果是使用hash函数,我猜测是使用了另外一种容器,将他们放到了一个链表当中,因为他们简直相同,无需对key进行排序,这里唯一有价值的是时间信息,因此使用链表足矣。

这里的多重集包括了multimapmultisetunordered_multimap,unordered_multiset

具体的一些用法总结如下。

1、insert

insert操作和前面的map,set没有多大区别,只是这里允许插入相同的键值

2、delete

multimap<string,string> students;
multimap.insert(make_pair("xiaoming","PKU"));
multimap.insert(make_pair("xiaoming","THU"));
multimap<string,string>::size_type cnt=students.erase("xiaoming");

上述代码返回删除的相同键值的元素的个数

3、查找

由于存在重复,因此需要应对重复的情形。同样以multimap为例

3.1传统的方法

typedef multimap<string,string>::size_type stype;
stype num = m.count("key");
multimap<string,string>::iterator iter;
iter=m.find("key");
for(int i=;i<num;i++){
cout<<iter->second<<endl;
iter++;
}

3.2使用upper bound和lower bound

typedef multimap<string,string>::iterator iteratortype;
iteratortype iterup=m.upper_bound("key");
iteratortype iterlow=m.lower_bound("key");
for(;iterup!=iterlow;iterup++){
cout<<iterup->second<<endl;
}

3.3使用equal_range(key)

typedef multimap<string,string>::iterator iteratortype;
pair<iteratortype,iteratortype> p=m.equal_range("key");
while(p.first != p.second){
cout<<p.first->second<<endl;
p.first++;
}

C++ 多重集的使用的更多相关文章

  1. Vijos_1792_摆花_(动态规划,多重集组合数)

    描述 https://vijos.org/p/1792 共n种花,第i种花有a[i]个,要摆m个,同一种花连续且花按照序号从小到大排,问共有多少种摆花方案.   描述 小明的花店新开张,为了吸引顾客, ...

  2. POJ_3046_Ant_Counting_(动态规划,多重集组合数)

    描述 http://poj.org/problem?id=3046 n种蚂蚁,第i种有ai个,不同种类的蚂蚁可以相互区分,但同一种类的蚂蚁不能相互区分,从这些蚂蚁中取出s,s+1,s+2,...,b- ...

  3. Problem I: STL——多重集的插入和删除

    Problem I: STL--多重集的插入和删除 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1729  Solved: 1258[Submit][ ...

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

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

  5. 乘法原理,加法原理,多重集的排列数(多个系列操作穿插的排列数) 进阶指南 洛谷p4778

    https://www.luogu.org/problemnew/solution/P4778 非常好的题目,囊括了乘法加法原理和多重集合排列,虽然最后使用一个结论解出来的.. 给定一个n的排列,用最 ...

  6. hdu6397 Character Encoding 母函数解约束条件下多重集

    http://acm.hdu.edu.cn/showproblem.php?pid=6397 原问题的本质是问m个元素的多重集S,每一种类型的对象至多出现n-1次的S的k组合的个数是多少? 等价于 x ...

  7. poj 3046 Ant Counting(多重集组合数)

    Ant Counting Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total ...

  8. Codeforces Round #523 (Div. 2)D(二分,多重集)

    #include<bits/stdc++.h>using namespace std;const long long N=1e5+5;const long long MOD=1e9+7;l ...

  9. Codeforces Round #527 (Div. 3)C(多重集,STRING)

    #include<bits/stdc++.h>using namespace std;const int maxn=1e6+7;pair<string,int>p[maxn]; ...

随机推荐

  1. IMX6下移植WKxxx驱动

    wkXXX.c #include<linux/init.h> #include <linux/module.h> #include <linux/kernel.h> ...

  2. Spark Streaming源码解读之Job动态生成和深度思考

    本期内容 : Spark Streaming Job生成深度思考 Spark Streaming Job生成源码解析 Spark Core中的Job就是一个运行的作业,就是具体做的某一件事,这里的JO ...

  3. Excel—“撤销工作表保护密码”的破解并获取原始密码

    您是否遇到过这样的情况:您用Excel编制的报表.表格.程序等,在单元格中设置了公式.函数等,为了防止其他人修改您的设置或者防止您自己无意中修改,您可能会使用Excel的工作表保护功能,但时间久了保护 ...

  4. java学习第四天

    那些逻辑语言就基本了解下,今天想到了一个问题就是关于for和while的区别,从专业上来说,for和while基本上是相同的,但是for是只允许一次访问的,如果结束后就无法继续访问,而while则可以 ...

  5. Python变量作用域(一)

    在一个程序中使用变量名时,Python创建.改变或者查找变量名都是在所谓的命名空间中进行的.作用域指的就是命名空间. Python中的变量名在第一次赋值时已经创建,并且必须经过赋值后才能够使用.由于变 ...

  6. Attribute "resource" must be declared for element type "mapper".

    今天在玩mybatis的时候,遇到这个奇葩问题. 最后发现,原因是 dtd文件配置错误了.错把Mapper的直接copy过来 把DOCTYPE mapper改成configuration,Mapper ...

  7. 一个用php实现的获取URL信息的类

    获取URL信息的类 使用这个类,你能获得URL的如下信息: - Host  - Path  - Statuscode (eg. 404,200, ...)  - HTTP Version  - Ser ...

  8. js jquery 扩展方法

    //扩展Array,增加IsInAyyay函数.函数功能:判断数组是否包含某元素 Array.prototype.IsInAyyay=function(e) { for (var i=0;i<t ...

  9. __future__

    [__future__] __future__用于改变python特性. 参考:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb4 ...

  10. Echarts x轴显示不全

    xAxis : [ { type : 'category', data : ['采矿业','制造业','电力热力燃气及水生产和供应业','建筑业'], axisTick: { alignWithLab ...