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网上商城项目实战23】完成在线支付功能
转自: https://blog.csdn.net/eson_15/article/details/51464415 上一节我们做好了支付页面的显示,从上一节支付页面显示的jsp代码中可以看出,当用 ...
- hadoop fs -put localfile . 时出现如下错误: could only be replicated to 0 nodes, instead of 1
hadoop fs -put localfile . 时出现如下错误:could only be replicated to 0 nodes, instead of 1网友的说法: 这个问题是由于没有 ...
- 跨域方法:JSONP、iframe
同源策略:浏览器出于安全考虑,会限制文档或脚本中发起的跨域请求(但src请求不受此限)资源的加载.实际上通过抓包软件可以发现请求和响应都会成功,但是响应数据并不会被浏览器加载.不同源的客户端脚本(ja ...
- 最简单,有效的学习mysql教程(一)
数据库 1 定义 数据库,可以简单的解释为:高效的存储和处理数据的介质(主要分为磁盘和内存两种). 2 分类 根据数据库存储介质的不同,可以将其分为两类,即:关系型数据库(SQL)和非关系型数据库(N ...
- Spring Data MongoDB 模糊查询
Pattern pattern = Pattern.compile("^.*" + value + ".*$"); Query query = new Quer ...
- <Android 基础(二十四)> EditText
介绍 A text field allows the user to type text into your app. It can be either single line or multi-li ...
- 4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)
代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 16:13:52 2018 @author: a " ...
- Java基础之JSONObject的使用
private static JSONObject createJSONObject() { JSONObject jsonObject = new JSONObject(); jsonObject. ...
- 为什么说对象字面量赋值比new Object()高效?
http://www.cnblogs.com/mushishi/p/5811743.html
- java笔记--重定向输出流实现程序输出到日志
重定向输出流实现程序输出到日志 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877248.html "谢谢-- 利用Sy ...