广州C++培训的小编这一期给大家讲Map和Multimap。

6.6 Maps和Multimaps

map和multimap将key/value

pair当作元素进行管理。他们可根据key的排序准则自动将元素排序。使用之前,你需要#include。

对于元素,1.key/value必须具备assignable和copyable性质。2.对排序准则而言,key必须是comparable。

1. Map和Multimap的能力

和所有标准的关联式容器一样,map/multimap通常以平衡二叉树完成。你可以把set和multiset分别视为特殊的map和multimap。因此map和multimap拥有set和multiset的所有能力和所有操作函数。当然某些细微差异还是有的:首先,它们的元素是key/value pair,其次,map可作为关联式数组来运用。

map和multimap根据元素的key自动对元素进行排序。“自动排序”这一性质使得map和multimap身上有了一条重要的限制:你不可以直接改变元素的key,因为这会破坏正常次序。要修改元素的key,你必须先移除拥有该key的元素,然后插入用于新的key/value的元素。从迭代器的观点来看,元素的key是参数。至于元素的value倒是可以直接修改的。

2. maps和multimaps的操作函数

生成、复制和销毁

map c

map c(op)

map c1(c2)

map c(beg, end)

map c(beg, end,

op)

c.~map()

其中map可以为:

map

Elem>

map

Elem, Op>

multimap

Elem>

multimap

Elem, Op>

非变动性操作

c.size()

c.empty()

c.max_size()

c1 == c2

c1 != c2

c1 < c2

c1 > c2

c1 <= c2

c1 >= c2

元素比较动作只能用于型别相同的容器。换言之,容器的key、value、排序准则都必须有相同的型别,否则编译期会产生型别方面的错误。

特殊的搜寻动作

count(key)

find(key)

lower_bound(key)

upper_bound(key)

equal_range(key)

成员函数find用来搜寻拥有某个key的第一个元素,并返回一个迭代器,指向该位置。如果没找到这样的元素,就返回容器的end。你不能find搜寻拥有某个特定value的元素,你必须改用通用算法find_if,或干脆写一个循环。

赋值

c1 = c2

c1.swap(c2)

swap(c1, c2)

迭代器函数和元素存取

c.begin()

c.end()

c.rbegin()

c.rend()

在map和multimap中,所有元素的key都被视为参数。因此元素的实质型别是pair。如果你一定得改变元素的key,只有一条路:以一个“value相同”的新元素替换掉旧元素。下面是个泛化函数:

namespace MyLib

{

template

inline

bool replace_key (Cont& c,

const typename

Cont::key_type& old_key,

const typename

Cont::key_type& new_key)

{

typename Cont::iterator pos;

pos = c.find(old_key);

if (pos != c.end())

{

c.insert(typename

Cont::value_type(new_key,

pos->second());

c.erase(pos);

return true;

}

else

return false;

};

};

注意,map提供一种非常方便的手法让你改变元素的key。

col1["new_key"]

= col1["old_key"];

col1.erase("old_key");

元素的安插和移除

c.insert(elem)

c.insert(pos,

elem)

c.insert(beg,

end)

c.erase(elem)

c.erase(beg,

end)

c.clear()

安插一个key/pair的时候,你一定要记住,在map和multimap内部,key被视为参数。有三种不同的方法可以将value传入map:

运用value_type

为了避免隐式型别转换,你可以利用value_type明白传递正确型别。value_type是哦那搞起本身提供的型别定义。

std::map<:string>

float> col1;

...

col1.insert(std::map<:string>

float>::value_type("otto", 22.3));

运用pair()

另一种做法是直接运用pair

std::map<:string>

,float> col1;

...

//隐式转换

col1.insert(std::pair<:string>("otto",

22.3));

//没有使用隐式转换

col1.insert(std::pair

std::string,float>("otto", 22.3));

运用make_pair()

最方便的办法是运用make_pair函数。

std::map<:string>

col1;

...

col1.insert(std::make_pair("otto",

22.3));

做法2一样,也是利用member

template insert来执行必要的型别转换。

移除元素时,当心发生意外状况。例如:

for

(pos=col1.begin(); pos!=col1.end(); ++pos)

if (pos->second == value)

col1.erase(pos); //对pos所指元素实施erase

//会使pos不再成为一个有效迭代器

下面是正确做法:

for

(pos=col1.begin(); pos!=col1.end();)

if (pos->second == value)

col1.erase(pos++); // tmp=pos, pos++,

tmp

else

++pos;

3.将Maps视为关联式数组

map可以通过operator[]直接存取元素。

关联式数组的行为方式可说是毁誉参半:

优点是你可以透过更方便的接口对着map安插新元素。

col1["otto"]

= 7.7; // 1.如果存在键值为“otto”的元素,以上是指返回该元素的ref

//  否则,调用default构造函数,并返回一个ref指向新元素

// 2.将7.7复制给value

缺点是你可能会不小心误置新元素。

std::cout<

//拼写错误

同时请注意,这种元素安插方式比一般的map安插方式来得慢,原因是新元素必须先使用default构造函数将实值初始化,而这个初值马上又被真正的value给覆盖。

了解详情请登陆广州达内C++培训官网(gz.c.tedu.cn)!

map multimapc++_C++的Map和Multimap相关推荐

  1. map multimapc++_C++ map 和 multimap

    一.  map 头文件  #include 1)map的定义: map m; 或者 typedef map  M; M m; 2)元素的插入 map m; 最常用的  m[key]=value;   ...

  2. map函数作用c语言,c语言中map的用法:map基本用法

    c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...

  3. Map获取键值,Map的几种遍历方法

    2019独角兽企业重金招聘Python工程师标准>>> Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集.接着,Map.Entry ...

  4. 【Groovy】map 集合 ( map 集合遍历 | 使用 map 集合的 find 方法遍历 map 集合 | 代码示例 )

    文章目录 一.使用 map 集合的 find 方法遍历 map 集合 二.代码示例 一.使用 map 集合的 find 方法遍历 map 集合 使用 map 集合的 find 方法遍历 map 集合 ...

  5. 【Groovy】map 集合 ( map 集合遍历 | 使用 map 集合的 each 方法遍历 map 集合 | 代码示例 )

    文章目录 一.使用 map 集合的 each 方法遍历 map 集合 二.代码示例 一.使用 map 集合的 each 方法遍历 map 集合 遍历 map 集合 , 可以调用 map 集合的 eac ...

  6. mAP@0.5 与 mAP@0.5:0.95 是什么意思,YOLOv5

    mAP@0.5: mean Average Precision(IoU=0.5) 即将IoU设为0.5时,计算每一类的所有图片的AP,然后所有类别求平均,即mAP 如图所示,AP50,AP60,AP7 ...

  7. flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?

    flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中? 如何在Dart / Flutter中将某些元素从一个Map复制到新Map中? Old_Map = {'A' ...

  8. json map java_Java:JSON和Map相互转换

    Java:JSON与Map相互转换 需要jar包:jackson-core-2.6.0.jar,jackson-databind-2.6.0.jar,jackson-annotations-2.6.0 ...

  9. java map 的复制,Java Map的深度复制和浅复制

    来看一段代码,猜一下运行结果! //给 list 放入 2个map对象 Listlist = new ArrayList(); Map map1 = new HashMap(); map1.put(& ...

最新文章

  1. java基础--日期--练习集锦
  2. Python3--baby网的数据爬取
  3. 2021年office2010每次打开都要配置进度解决方法
  4. Linux学习Vim使用及账号用户管理
  5. python函数返回值的应用
  6. 复制:为什么你说“就差一个码农了”,我们是拒绝的
  7. 全网首发:GB18030中,蒙文的错误
  8. UOJRoundPLUS+
  9. 大数据与AI平台:人工智能+大数据赋能产业供应链智能化风控核动力 PPT分享
  10. excel中常用函数index、match、row、column的用法
  11. python编程考试_Python编程练习(一)
  12. 龙芯平台(LoongArch)常用开发工具安装
  13. 【自动驾驶-感知-红绿灯】红绿灯识别知识点
  14. 倒三角打印乘法口诀python_Python打印乘法口诀表
  15. 洛谷P1478 陶陶摘苹果(升级版)
  16. 无穷项和求极限(夹逼准则)
  17. Android集成佳博热敏打印机打印小票功能
  18. 【肥朝】从JDK中,我们能学到哪些设计模式?
  19. 在树莓派Raspbian/Debian 10 Buster上安装ROS
  20. Linux内核配置选项的说明,Linux内核配置选项翻译

热门文章

  1. 涉密文件检查工具_肇庆高要销毁资料文件公司粉碎销毁文件资料公司欢迎您
  2. 【亲测可用】改变鼠标样式
  3. 在macOS 10.13.6上安装go 1.13.8实录
  4. 在Ubuntu 16.04.6 LTS上安装python3.7和pip3后出现Command '('lsb_release', '-a')' 出错问题的解决方法
  5. ubuntu 大小写指示的小工具
  6. Java和.NET使用DES对称加密的区别
  7. Linux 终端命令行提示符的艺术--PS1进阶
  8. !! 机器学习常用工具
  9. CssGaga 快速上手指南
  10. [转]自定义hadoop map/reduce输入文件切割InputFormat