multimap详讲
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详讲的更多相关文章
- zTree应用实例详讲(3)
zTree应用实例详讲(3) 上一讲中,已经讲到了重命名与删除.那么这一讲,我们来做新建文件夹. 其实新建是非常简单的,想一下我们想要的效果:点击新建,然后在一个节点下面出现一个新建的文件夹,并且与此 ...
- zTree应用实例详讲
zTree应用实例详讲(1) 因为项目的需要,要创建一棵动态的文件树,此树除了实现异步获取子节点外,还要实现对树节点的增.删.改.查.移动.重命名.批量删除.批量移动. 每一个操作都要和数据库打交道. ...
- Java - 静态代理详讲
Java - 静态代理详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:*此章内容比较抽象,所以需要结合实际操作进行讲解* *需要有 ...
- Nginx技术进阶详讲
Nginx技术进阶详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 并发数问题 讲到并发数这个概念,想必各位应该都知道是什么意思,就是同时访问一个项目,就比我们现在做的一些项目完 ...
- SQL优化 MySQL版 - B树索引详讲
SQL优化 MySQL版 - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...
- SQL优化 MySQL版 - 多表优化及细节详讲
多表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...
- SQL优化 MySQL版 - 单表优化及细节详讲
单表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...
- Nginx -- nginx.conf 配置文件详讲
Nginx服务器配置,nginx.conf文件代码详讲,结合不同楼主的博文得到: #关掉访问日志可以优化服务器 #定义Nginx运行的用户和用户组 #user nobody; #nginx进程数 #如 ...
- hibernate(九) 二级缓存和事务级别详讲
序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...
随机推荐
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
转自:https://blog.csdn.net/eson_15/article/details/51405911 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...
- gRPC的简单Go例子
gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发 ...
- HDU 1875(最小生成树)
因为是全连接图,所以也可以用最小生成树 这道题给边加了一个限制条件,(10<=x<=1000),所以可能不能全连通,需要判断 #include <cstdio> #includ ...
- ES6学习笔记(五)-函数扩展
- drupal7 profile2模块获取个人信息
一.问题背景: 用profile2模块,扩展个人信息,增加了“手机号”等信息,一些地方想要获取当前用户的手机号 二.解决办法: 用profile2自带的方法:profile2_load_by_user ...
- eslint规则记录
"off"或者0 //关闭规则关闭 "warn"或者1 //在打开的规则作为警告(不影响退出代码) "error"或者2 //把规则作为一个 ...
- Java线程唤醒与阻塞
阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一 定已经很熟悉了.Java 提供了大量方法来支持阻塞,下面让我们逐一分析. 转载于:http://blog.cs ...
- 利用Ogr将Kml转为Shape【1】
最近在研究Kml怎么转化为Shape文件,因为客户中很多在原来采集了一部分数据都是在google Earth中,而我们的应用中特别需要这份数据,所以打算先在GE中把这份数据导出为Kml或Kmz文件,然 ...
- 横向开关(switch)
横向开关(switch) 一:属性 1.Activity //横向开关 public class SwitchActivity extends Activity { private Switch sw ...
- hustoj搭建--常见问题
环境: Centos6.5 apache2+PHP5+MySQL 设置apache服务器网站根路径(设置之后可通过IP访问OJ) 1. 进入目录/etc/httpd/conf下的httpd.con ...