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. tensorflow(一):图片处理

    一.图片处理 1.图片存取 tf.gfile import tensorflow as tf import matplotlib.pyplot as plt image_bytes = tf.gfil ...

  2. Redis-Map

    Redis Map 存储K-V键值对.(跟Java的Map类比) 哈希表结构: typedef struct dictht { dictEntry **table;  //哈希表数组 unsigned ...

  3. 几个css3动画库

    Hover.css 查看演示: http://ianlunn.github.io/Hover/ github地址: https://github.com/IanLunn/Hover Animate.c ...

  4. JS获取今天年月日

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 自己写的一个nodejs查找文件模块-node-find-all-files

    最近在折腾着用node-webkit搭建一个工具,其中要查找路径下的所有文件然后再进行压缩等操作,于是进写了这样的一个模块.代码如下: /* 输入目录找出目录下的所有文件,包括文件夹 */ /* 依赖 ...

  6. 【转】PHP如何快速读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  7. SQL函数应用-DATEPART()

    作用:DATEPART() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 语法格式:DATEPART(datepart,date) 参数说明: datepart 是指定应返回的日 ...

  8. Windows API 查找窗体,发送Windows消息

    最近项目中需要做Windows消息截获操作,在网上找了一些资料. public class WindowsAPI { /// <summary> /// 回调函数代理 /// </s ...

  9. SSM框架——实现分页和搜索分页

    登录|注册     在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish.       目录视图 摘要视图 订阅 [公告]博客系统优化升级     ...

  10. chchc

    ---恢复内容开始--- 51CTO博客-原创IT文章分享平台 Logo 首页 文章 专家 专家博客 博客之星 推荐博客 我的博客 网站导航 学院 博客 下载 家园 论坛 CTO训练营 WOT 51C ...