map和multimap的用法详解
一、map的文档总结1、map是关联式容器,它按照key值比较存储,默认是小于;2、在map中,键值key通常用于唯一的标识元素,而值value中存储与此键值key关联的内容;键值key和value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名为pair;3、map中的元素是键值对;4、map中的key是唯一的,并且不能...
一、map的文档总结
1、map是关联式容器,它按照key值比较存储,默认是小于;
2、在map中,键值key通常用于唯一的标识元素,而值value中存储与此键值key关联的内容;键值key和value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名为pair;
3、map中的元素是键值对;
4、map中的key是唯一的,并且不能修改,遇到重复的key就会插入失败;但可以利用operator[]对value进行修改;
5、map的底层实现为红黑树,查找效率比较高,是O(logN);
二、关于键值对pair
STL中对于键值对的定义:
template <class T1,class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair()
: first(T1())
, second(T2())
{}
pair(const T1&a, const T2&b)
: first(a)
, second(b)
{}
};
三、map的重要接口
1、insert
下面是这两种插入方式的返回值的解释:
下面介绍一下insert的使用
int main()
{
map<string, string> m;
//map底层是键值对的形式存储,所以在插入的时候要构造键值对
m.insert(pair<string,string>("apple", "苹果"));
m.insert(make_pair("apple", "苹果"));
m.insert(make_pair("banana", "香蕉"));
m.insert(make_pair("banana", "香蕉"));
m.insert(make_pair("peach", "桃子"));
map<string, string>::iterator it = m.begin();
//m.insert(it, make_pair("apple", "苹果"));
while (it != m.end())
{
//*it取到pair,pair里面存的是键值对,然后再用.访问它里面的first和second
//cout << (*it).first << ":" << (*it).second << endl;
//(.)是结构体成员变量访问成员函数,(->)是结构体指针访问成员
//pair是一个结构体指针
cout << it->first << ":" << it->second << endl;
++it;
}
cout << endl;
system("pause");
return 0;
}
输出结果:
可以看出在插入的时候,map进行了排序和去重。
2、删除erase
删除键值为“ x ”的元素,以上述代码为例,删除键值为”apple“的元素
m.erase("apple");
3、交换swap
map的底层是一个平衡搜索树( 红黑树),所以交换的时候只用交换根节点即可。
利用上述插入代码,交换strs和m;
map<string, string> strs;
strs.insert(make_pair("apple", "aaa"));
strs.insert(make_pair("banana", "bbb"));
strs.insert(make_pair("banana", "xxx"));
strs.insert(make_pair("peach", "ppp"));
m.swap(strs);
输出结果:
4、find 查找键值为“X”的元素
返回值:
5、map的重点 operator[ ]
根据文档可看出,operator[ ] 插入的是key,返回的是与key对应的value。
先看一段代码:
mapped_type& operator[](const key_type& k)
{
return (*((this->insert(make_pair(k, mapped_type()))).first)).second;
}
可以看出operator[ ] 中用到了插入函数,下面我们来分析一下这段让各位童鞋头疼的代码:
需要注意的是,当key存在时,找到与key对应的value,然后返回其引用;
当key不存在时,operator[ ]用默认value与key构造键值对然后插入,返回该默认的value。
6、operator[ ]支持元素的存取
map/multimap和set/multiset都是关联式容器,不支持对元素的直接存取,通过迭代器进行,但是map有个例外,利用operator[ ]直接存元素,并且下标不一定是整型,可以是任意类型,这种接口视为关联式数组。
并且,利用这种方式插入元素不存在数组越界的情况,如果使用一个可以作为索引,而该key尚不存在map中,map会重载operator[]插入新元素,新元素的value值由构造函数确定,一般为0.
例如:
m["orange"] = "橘子";
会经历如下操作:
处理 m["orange"]
如果map中存在键值”orange“的元素,则返回该元素的引用;
如果不存在,则自动创建值为“orange”的元素,key所对应的value由默认的构造函数赋值。
处理m["orange"] = "橘子"
橘子通过赋值操作赋值给新诞生的元素“orange”。
结合insert的代码,输出结果为:
使用下标操作符接口,map的插入更加便捷,但该方式在效率上,同其他安插方式相比较慢一些。
四、multimap基本用法
multimap和map的功能类似,就不一一介绍了,下面主要说一下这两者的不同:
1、multimap中的key可以重复
2、multimap中没有重载operator[ ]功能
3、对于重复的元素,查找的时候也是返回中序遍历的第一个元素,至于为什么,前面讲set的时候已经介绍过了,若不理解,课参考这篇博客:https://blog.csdn.net/yam_sunshine/article/details/89340462
更多推荐
所有评论(0)