当前位置: 首页 > news >正文

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 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

相关文章:

  • 剑指offer-树的子结构
  • JavaScript HTML DOM
  • js提交表单错误:document.form.submit() is not a function
  • React as a UI Runtime(五、列表)
  • 如何进阶一名有竞争力的程序员?
  • 实现简单的正则表达式引擎
  • 读写配置文件模块configparser—参考杨永明博客
  • Android的WIFI局域网对讲机
  • todo: 改变字体的动画
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 翻译:Hystrix - How To Use
  • k8s应用机密信息与配置管理(九)--技术流ken
  • 如何使用 JavaScript 解析 URL
  • patchwork.ffmpeg.org 里面未被选中的优秀代码
  • c# 设计模式
  • Google 是如何开发 Web 框架的
  • 10个最佳ES6特性 ES7与ES8的特性
  • crontab执行失败的多种原因
  • CSS3 变换
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • extract-text-webpack-plugin用法
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JAVA并发编程--1.基础概念
  • JS 面试题总结
  • js 实现textarea输入字数提示
  • JS函数式编程 数组部分风格 ES6版
  • k8s 面向应用开发者的基础命令
  • Mybatis初体验
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • RxJS: 简单入门
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 初探 Vue 生命周期和钩子函数
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 驱动程序原理
  • 学习笔记:对象,原型和继承(1)
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 云大使推广中的常见热门问题
  • kubernetes资源对象--ingress
  • #QT(智能家居界面-界面切换)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (接口封装)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (一)80c52学习之旅-起始篇
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net反编译工具
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)