map multimapc++_C++的Map和Multimap
广州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相关推荐
- map multimapc++_C++ map 和 multimap
一. map 头文件 #include 1)map的定义: map m; 或者 typedef map M; M m; 2)元素的插入 map m; 最常用的 m[key]=value; ...
- map函数作用c语言,c语言中map的用法:map基本用法
c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...
- Map获取键值,Map的几种遍历方法
2019独角兽企业重金招聘Python工程师标准>>> Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集.接着,Map.Entry ...
- 【Groovy】map 集合 ( map 集合遍历 | 使用 map 集合的 find 方法遍历 map 集合 | 代码示例 )
文章目录 一.使用 map 集合的 find 方法遍历 map 集合 二.代码示例 一.使用 map 集合的 find 方法遍历 map 集合 使用 map 集合的 find 方法遍历 map 集合 ...
- 【Groovy】map 集合 ( map 集合遍历 | 使用 map 集合的 each 方法遍历 map 集合 | 代码示例 )
文章目录 一.使用 map 集合的 each 方法遍历 map 集合 二.代码示例 一.使用 map 集合的 each 方法遍历 map 集合 遍历 map 集合 , 可以调用 map 集合的 eac ...
- 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 ...
- flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?
flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中? 如何在Dart / Flutter中将某些元素从一个Map复制到新Map中? Old_Map = {'A' ...
- 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 ...
- java map 的复制,Java Map的深度复制和浅复制
来看一段代码,猜一下运行结果! //给 list 放入 2个map对象 Listlist = new ArrayList(); Map map1 = new HashMap(); map1.put(& ...
最新文章
- java基础--日期--练习集锦
- Python3--baby网的数据爬取
- 2021年office2010每次打开都要配置进度解决方法
- Linux学习Vim使用及账号用户管理
- python函数返回值的应用
- 复制:为什么你说“就差一个码农了”,我们是拒绝的
- 全网首发:GB18030中,蒙文的错误
- UOJRoundPLUS+
- 大数据与AI平台:人工智能+大数据赋能产业供应链智能化风控核动力 PPT分享
- excel中常用函数index、match、row、column的用法
- python编程考试_Python编程练习(一)
- 龙芯平台(LoongArch)常用开发工具安装
- 【自动驾驶-感知-红绿灯】红绿灯识别知识点
- 倒三角打印乘法口诀python_Python打印乘法口诀表
- 洛谷P1478 陶陶摘苹果(升级版)
- 无穷项和求极限(夹逼准则)
- Android集成佳博热敏打印机打印小票功能
- 【肥朝】从JDK中,我们能学到哪些设计模式?
- 在树莓派Raspbian/Debian 10 Buster上安装ROS
- Linux内核配置选项的说明,Linux内核配置选项翻译
热门文章
- 涉密文件检查工具_肇庆高要销毁资料文件公司粉碎销毁文件资料公司欢迎您
- 【亲测可用】改变鼠标样式
- 在macOS 10.13.6上安装go 1.13.8实录
- 在Ubuntu 16.04.6 LTS上安装python3.7和pip3后出现Command '('lsb_release', '-a')' 出错问题的解决方法
- ubuntu 大小写指示的小工具
- Java和.NET使用DES对称加密的区别
- Linux 终端命令行提示符的艺术--PS1进阶
- !! 机器学习常用工具
- CssGaga 快速上手指南
- [转]自定义hadoop map/reduce输入文件切割InputFormat