multimap和map的区别:

首先认识一下multimap和map的区别:

1>        multimap不提供operator[ ]运算符。因为这个运算符的语义在同一个键可以保存多个值的容器multimap里是无意义的。

2>        multimap插入元素的时候总是能成功的。所以插入insert()方法只返回一个iterator。不像是map的insert()返回的是《iterator , bool》.

麻烦的是multimap查找元素的时候,因为这里不提供operator[ ],而find(key)返回的可能是多个元素,这也不准确。但是multimap提供了lower_bound()和upper_bound()函数;

分别返回的是同一个健的第一个元素得迭代器和最后一个元素得下一个元素得迭代器。注意的是,如果没有这个键值,则lower_bound和upper_bound是相同得;还有一个方法就是使用equal_bound()方法。这个函数返回的是两个iterator得std::pair<>(分别是lower_bound()和upper_bound()得迭代器);

#include <iostream>
#include <map>
#include <utility> //utility是实用性工具类得意思
#include <list> class Buddylist
{
public:
void addBuddy(const std::string &name , const std::string &buddy);
bool isBuddy(const std::string &name , const std::string &buddy);
void delBuddy(const std::string &name , const std::string &buddy);
std::list<std::string> getBuddies(const std::string &name) const; private:
std::multimap<std::string , std::string> mBuddies;
}; void Buddylist::addBuddy(const std::string &name , const std::string &buddy)
{
if(!isBuddy(name,buddy))
{
mBuddies.insert({name,buddy});
}
}
bool Buddylist::isBuddy(const std::string &name , const std::string &buddy)
{
auto iter = mBuddies.equal_range(name); //返回的是key = name得这个范围的所有得值对应的迭代器
auto Beg = iter.first; //这些元素的首迭代器
auto End = iter.second; //最后元素得后一个得迭代器
for(;Beg != End;++Beg)
{
if(Beg->second == buddy)
{
return true;
}
}
return false; }
void Buddylist::delBuddy(const std::string &name , const std::string &buddy)
{
auto Beg = mBuddies.lower_bound(name);
auto End = mBuddies.upper_bound(name);
while(Beg != End)
{
if(Beg->second == buddy)
{
mBuddies.erase(Beg);
break;
}
++Beg;
}
}
std::list<std::string>Buddylist::getBuddies(const std::string &name) const
{
auto range = mBuddies.equal_range(name);
auto Beg = range.first;
auto End = range.second;
std::list<std::string> mNameList;
while(Beg != End)
{
mNameList.push_back(Beg->second);
++Beg;
}
return mNameList;
}
int main()
{
Buddylist buddy1,buddy2;
std::list<std::string> list_1,list_2;
buddy1.addBuddy("list_1","wenjie");
buddy1.addBuddy("list_1","meijun");
buddy1.addBuddy("list_1","taoge");
buddy1.addBuddy("list_1","dajun"); buddy1.delBuddy("list_1","taoge");
list_1 = buddy1.getBuddies("list_1");
for(auto &iter : list_1)
{
std::cout << "list_1 : " << iter << std::endl;
} buddy2.addBuddy("list_2","abcd");
buddy2.addBuddy("list_2","fefg");
buddy2.addBuddy("list_2","jhnf");
buddy2.addBuddy("list_2","errh"); list_2 = buddy2.getBuddies("list_2");
for(std::list<std::string>::iterator iter = list_2.begin();
iter != list_2.end();++iter)
{
std::cout << "list_2 : " << *iter << std::endl;
} return ;
}

结果是:

list_1 : wenjie
list_1 : meijun
list_1 : dajun
list_2 : abcd
list_2 : fefg
list_2 : jhnf
list_2 : errh

multimap详讲的更多相关文章

  1. zTree应用实例详讲(3)

    zTree应用实例详讲(3) 上一讲中,已经讲到了重命名与删除.那么这一讲,我们来做新建文件夹. 其实新建是非常简单的,想一下我们想要的效果:点击新建,然后在一个节点下面出现一个新建的文件夹,并且与此 ...

  2. zTree应用实例详讲

    zTree应用实例详讲(1) 因为项目的需要,要创建一棵动态的文件树,此树除了实现异步获取子节点外,还要实现对树节点的增.删.改.查.移动.重命名.批量删除.批量移动. 每一个操作都要和数据库打交道. ...

  3. Java - 静态代理详讲

    Java - 静态代理详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:*此章内容比较抽象,所以需要结合实际操作进行讲解*                   *需要有 ...

  4. Nginx技术进阶详讲

    Nginx技术进阶详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 并发数问题 讲到并发数这个概念,想必各位应该都知道是什么意思,就是同时访问一个项目,就比我们现在做的一些项目完 ...

  5. SQL优化 MySQL版 - B树索引详讲

    SQL优化 MySQL版  - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...

  6. SQL优化 MySQL版 - 多表优化及细节详讲

    多表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...

  7. SQL优化 MySQL版 - 单表优化及细节详讲

    单表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...

  8. Nginx -- nginx.conf 配置文件详讲

    Nginx服务器配置,nginx.conf文件代码详讲,结合不同楼主的博文得到: #关掉访问日志可以优化服务器 #定义Nginx运行的用户和用户组 #user nobody; #nginx进程数 #如 ...

  9. hibernate(九) 二级缓存和事务级别详讲

    序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...

随机推荐

  1. 一、hive安装(内置数据库derby)

    hive是一个数据仓库工具,建立在hadoop之上,它的存在是为了让大数据的查询和分析更加的方便.hive提供简单的sql查询功能,并最终转换为mapreduce任务执行. 一.环境 JDK1.8+官 ...

  2. golang 的 sync.WaitGroup

    WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成. 官方对它的说明如下: A WaitGroup waits for ...

  3. HDU 4747(AC不能)

    http://acm.hdu.edu.cn/showproblem.php?pid=4747

  4. spss C# 二次开发 学习笔记(二)——Spss以及统计术语解释(IT人眼中的统计术语)

    针对客户需求,需要对一些数据做统计分析.统计分析的第一步,即为数据查询,查找出要统计分析的数据. 查询得出的是一个行列表格的结果集,行.列.表格等这些IT的数据库概念和Spss以及统计中的术语是如何对 ...

  5. java三元运算符

    由?:符号表示的,具体的含义其实就和if-else结构的含义差不多,这种运算符会将某个条件作两种处理,如果满足条件的话就执行第一个结果,如果不满足的话就执行另外一个结果,例如: Int A,B,C;  ...

  6. html5 转义实体字符 元数据 跳转 全局属性 id class lang style

    实体 Html 实体就是把特殊字符通过代码显示出来, 比如, <>在浏览器会识别为标签,不能正常显示, 这是你就需要安如<去表达左尖括号.     元数据 2. 声明字符编码 3.模 ...

  7. 基于 Web 的 Go 语言 IDE - Wide 1.5.1 发布!

    Wide 是一个基于 Web 的 Go 语言 IDE, 其目标不是彻底代替本地 IDE,而是做本地 IDE 很难做到的事情: 分享代码:类似 playground,但支持多文件并提供嵌入方式,在其他网 ...

  8. Google Map API V3调用arcgis发布的瓦片地图服务

    由于最近项目需要用到CAD制作的地图,但之前一直使用的是用谷歌离线瓦片地图的方式,怎么样把CAD图像地图一样有缩放,移动的功能放到网页显示成了难题, 原先的谷歌地图的代码难道就不能用了?重新写一套代码 ...

  9. Get a “step-by-step” evaluation in Mathematica

    Is it possible in Mathematica to get a step-by-step evaluation of some functions; that's to say, out ...

  10. Navicat 连接 Oracle数据库并,导入数据泵(.dmp)

    如有什么质疑的地方,希望可以和大家一起探讨,共同进步. 一.安装方法: 1.首先下载Navicat Premium和Oracle Database Oracle Database官网下载地址:http ...