目录
还有一种方法,就是所有的容器都支持initializer_list
当然为什么打印出来的结果是跟刚开始的定义的花括号里面的内容顺序不同呢?
map初识
key和value用pair来表示
pair是一个键值对,其实就是用一个结构体来存key和value
first不能修改,就是key的值不能修改。
与set不同的是多了个operator[]
如何定义一个map类型的对象并且插入一个值呢?
如下有4种方法
解释:
第一个表示
定义一个有名对象,传值
第二个表示
定义一个匿名对象,传值
第三个表示
函数模版make_pair,见字如面,传两个参数即可。
第四个表示
多参数的构造,用花括号来定义, 隐式类型转换。
当然推荐使用后两种。
make_pair参考图
还有一种方法,就是所有的容器都支持initializer_list
外层是initializer_list,内层是隐式类型转换。
cout打印
当然如果直接打印*it,则会报错,因为pair没有重载流提取,所以要用pair里面的成员,因为pair是个结构体,所以可以使用如下图解释:
当然为什么打印出来的结果是跟刚开始的定义的花括号里面的内容顺序不同呢?
因为string类型在map里也是根据搜索二叉树的规则来排序,string也就是用ASCII码来比较的。
还有一种方法就是用->箭头来表示如下解释:
it->调用operator->,返回的是节点的指针,节点是个结构体pair,所以写成it->->first,
为了方便观察,省略了一个->,所以最终的表示方式是:it->first。
可以使用第一种,但是一般都用第二种
其实这里才是最常用operator->的地方,因为有pair这个结构体。
当然如果用范围for时也要注意:
以上的代码也很坑,因为自定义类型,数据量大,全是深拷贝,如果是整形那无所谓,但是是自定义类型要像如下写:
扩展:有些书上或者课上会看到如下方式C++17遍历:
上述代码是C++17的,如下图可以更改默认的C++语言标准。
最后展示查找单词代码如下:
展示统计次数代码如下:
operator[]
含义:
opreator[]的参数是key,operator[key]表示value。
operator其实是可以做插入+修改的。
可以通过一下代码来在VS上测试。
multimap
multimap允许建值冗余。
以及没有提供[],因为如果有[],多个同样的pair,那应该返回谁的呢?这很像调用函数时,如果有多个同样的函数,会冲突。
结尾:
所以如果想深入理解并使用的话,需要查看文档解析,以及做OJ题来巩固key和key/value的知识体系。
map - C++ Reference---map参考
multimap - C++ Reference ---multimap参考