之前只是在C++ Primer里面看过关联容器,可能因为没有实际用过,只是看看,所以导致用的时候并不熟悉;

在这之前,map和set的特性应该要了解,map是关联数组,也就是由键值对组成的,而set只是关键字的集合,但是两者都只允许关键字是唯一的,也就是对于一个给定的关键字,它只能允许一个元素的关键字等于它;

但是,容器multimap和multiset并没有这个限制,它们都允许多个元素具有相同的关键字。

如何访问multimap呢,也就是如何查找元素呢?

这个时候需要先了解multimap的函数:

find(k) 返回第一个关键字为k的迭代器

count(k) 返回关键字等于k的个数

lower_bound(k) 返回第一个关键字不小于k的元素

upper_bound(k) 返回第一个关键字大于k的元素

equal_bound(k) 上面返回的是迭代器,但是这里返回的迭代器pair,表示关键字等于k的元素的范围,若k不存在,pair的两个成员均等于end()

注意:多个相同的关键字存储在容器中时,则会相邻存储;

根据以上的函数,可以使用三种方法进行查找元素

第一种方法:find + count

multimap<string, int> maps;
string word("word");
//注意是第一个出现的
auto itr = maps.find(word);
auto cnt = maps.count(word);
//循环便利
while (cnt) {
cout << itr->second << endl;
++itr;
cnt--;
}

第二种方法:lower_bound + upper_bound

multimap<string, int> maps;
string word("word");
//其实就是一个区间,因为存储位置连续
for (auto beg = maps.lower_bound(word), end = maps.upper_bound(word); beg != end; ++beg) {
cout << beg->second << endl;
}

第三种方法:equal_range

multimap<string, int> maps;
string word("word");
// 和上面不一样,直接返回一个区间
for (auto pos = maps.equal_range(word); pos.first != maps.end(); ++pos.first) {
cout << pos.first->second << endl;
}

对了还有unordered,这是没有进行排序的,同样的这些无序容器同样有重复关键字的版本-unordered_multimap,unordered_multiset,这些是用哈希函数实现,没有unordered的则是用红黑树实现的。

mutiplemap 总结的更多相关文章

随机推荐

  1. javade多任务处理之Executors框架(线程池)实现的内置几种方式与两种基本自定义方式

    一 Executors框架(线程池) 主要是解决开发人员进行线程的有效控制,原理可以看jdk源码,主要是由java.uitl.concurrent.ThreadPoolExecutor类实现的,这里只 ...

  2. 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!

    一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...

  3. ubuntu下使用qemu模拟ARM(六)------驱动程序【转】

    转自:http://blog.csdn.net/rfidunion/article/details/54709843 驱动程序分为在ubuntu上运行和在ARM开发板上运行两种,我们分别来进行测试 1 ...

  4. ubuntu git 简单入门【转】

    转自:http://blog.chinaunix.net/uid-20718384-id-3334859.html 1. 安装 sudo apt-get install git-core 2.  初始 ...

  5. linux系统时钟和硬件时钟不一致

    在做DB2 集群复制的时候要求两台主机时间相互一致. 但是在一台主机上系统时间和硬件时间相差12个小时左右:手动同步后,重启后又相差12个小时左右. 为什么会是这样的,先介绍下系统时钟和硬件时钟的区别 ...

  6. Gradle设置代理

    在本地仓库路径下(如果没有修改的话默认C:\Users\用户名\.gradle),或者项目下,新建一个文件gradle.properties systemProp.http.proxyHost=网址 ...

  7. Visual Studio 2017 for Mac

    Visual Studio 2017 for Mac Last Update: 2017/6/16 我们非常荣幸地宣布 Visual Studio 2017 for Mac 现已推出. Visual ...

  8. HDU 2476 String painter(区间DP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...

  9. C++之可调用对象

    C++中的可调用对象分为以下几种: 函数 函数指针 lambda表达式 bind创建的对象 重载了函数调用运算符(即“()”)的类 函数.函数指针不再介绍.lambda表达式与bind创建的类参考—— ...

  10. MySQL约束笔记

    MySQL 查看约束,添加约束,删除约束 添加列,修改列,删除列 · 查看表的字段信息:desc 表名; · 查看表的所有信息:show create table 表名; 添加主键约束:alter t ...