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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐