之前只是在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. os._exit(), sys.exit(), exit()

    1. sys.exit(n) 退出程序引发SystemExit异常, 可以捕获异常执行些清理工作. n默认值为0, 表示正常退出. 其他都是非正常退出. 还可以sys.exit("sorry ...

  2. STL容器 vector,list,deque 性能比较

    C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差 ...

  3. Python_oldboy_自动化运维之路(四)

    本节内容 集合 字符编码与转码 函数语法及基本特性 函数参数与局部变量 返回值和嵌套函数 递归 匿名函数 高阶函数 1.集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变 ...

  4. FTRL算法

    稀疏解的作用:内存和时间啊 实际的互联网广告应用需要的是快速地进行model的更新.为了保证快速的更新,训练样本是一条一条地过来的,每来一个样本,model的参数对这个样本进行一次迭代,从而保证了mo ...

  5. 【转】shell命令中>/dev/null 2>&1的实现原理

    异步执行 exec("/alidata/server/php/bin/php /nas/wxdoctor/index.php App/Common/WordsPic/user_id/&quo ...

  6. JAVA复习笔记分布式篇:zookeeper

        前言:终于到分布式篇,前面把JAVA的一些核心知识复习了一遍,也是一个JAVA程序员最基本要掌握的知识点,接下来分布式的知识点算是互联网行业的JAVA程序员必备的技能:     概念:ZooK ...

  7. java批量生成excel文件

    1.导入用于操作excel的jar,地址:https://pan.baidu.com/s/1qXADRlU 2.生成excel使用的模版文件,地址:https://pan.baidu.com/s/1c ...

  8. BCD码

    BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码,是用4位二进制数来表示1位十进制数中的0~9这10个数码,用一种使用二进制编码十进制的数字编码形式.BCD码这种 ...

  9. hdu 1028 整数划分 (母函数)

    假如输入44 = 4;4 = 3 + 1;4 = 2 + 2;4 = 2 + 1 + 1;4 = 1 + 1 + 1 + 1;一共5种 假如输入3 用母函数的方法就是写成(1+X+X2+X3)(1+X ...

  10. day6 ConfigParser模块 yaml模块

        yaml模块: python可以处理yaml文件,yaml文件安装的方法为:$ pip3 install pyyaml    configparser模块,用来处理文件的模块,可以实现文件的增 ...