博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
multimap详讲
阅读量:7233 次
发布时间:2019-06-29

本文共 2747 字,大约阅读时间需要 9 分钟。

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 
#include
#include
//utility是实用性工具类得意思#include
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
getBuddies(const std::string &name) const;private: std::multimap
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
Buddylist::getBuddies(const std::string &name) const{ auto range = mBuddies.equal_range(name); auto Beg = range.first; auto End = range.second; std::list
mNameList; while(Beg != End) { mNameList.push_back(Beg->second); ++Beg; } return mNameList;}int main(){ Buddylist buddy1,buddy2; std::list
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
::iterator iter = list_2.begin(); iter != list_2.end();++iter) { std::cout << "list_2 : " << *iter << std::endl; } return 0;}

 

结果是:

list_1 : wenjie

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

 

转载于:https://www.cnblogs.com/boost/p/10413903.html

你可能感兴趣的文章
找出1-100中缺失的两个数
查看>>
Work with Unicode, CCSID & DBCS
查看>>
scanf()总结--从网上收来的,感觉很好,用来提醒自己,c语言真是博大精深!!【转】...
查看>>
Linux环境下段错误的产生原因及调试方法小结【转】
查看>>
Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)【转】...
查看>>
ubantu系统安装ssh
查看>>
js实现对上传图片的路径转成base64编码,并且对图片进行压缩,实现预览功能...
查看>>
LeetCode OJ:Multiply Strings (字符串乘法)
查看>>
LeetCode OJ:Search in Rotated Sorted Array(翻转排序数组的查找)
查看>>
VLC打开.264文件
查看>>
常用的一些webService
查看>>
Codeigniter开发技巧:连接多个数据库(可实现DB读写分离)
查看>>
Mybatis注意点之#与$区别
查看>>
IP地址分类(A类 B类 C类 D类 E类)
查看>>
RedirectResult,RedirectToRoute
查看>>
解决spark-shell输出日志过多的问题
查看>>
npm包管理工具
查看>>
[洛谷P3168][CQOI2015]任务查询系统
查看>>
鼠标放上去图片切换效果
查看>>
String Method的字符串变换的一个例子
查看>>