目录
一、operator[ ]函数介绍
二、insert函数介绍
三、operator[ ]函数实现原理
四、operator[ ]函数功能
一、operator[ ]函数介绍
mapped_type& operator[] (const key_type& k);
在map容器中存储的是一个键值对value_type,其本质是pair<const key_type, mapped_type>,mapped_type是键值对中第一个元素类型,key_type是键值对中第二个元素的类型
operator[ ]并非是像vector容器一样传入下标进行随机访问,而是
我们传入一个k参数:
如果map容器中已经存在k,插入失败,返回已经存在k的键值对的第二个元素的引用
如果map容器中不存在k,就用k和mapped_type类型的默认构造函数构建一个键值对并插入,返回新插入键值对的第二个元素的引用
(mapped_type类型的默认构造函数:如果int类型就调用int的默认构造函数,默认对象值为0;string类型就调用string类型的默认构造函数,默认对象值为空串"")
二、insert函数介绍
想要明白operator[ ]函数的实现原理,必须明白insert函数的使用,因为operator[ ]是调用insert函数实现的
观察单参数insert插入函数,函数原型为
pair<iterator,bool> insert (const value_type& val);
参数类型为const value_type&,即const pair<const key_type, mapped_type>&;
返回值类型为键值对pair<iterator,bool>
插入一个键值对pair<const key_type, mapped_type>:
如果map中已存在键值对的key_type,插入失败,返回pair<已存在的键值对的迭代器, false>
如果map中不存在键值对的key_type,插入成功,返回pair<新插入的键值对的迭代器, true>
三、operator[ ]函数实现原理
mapped_type& operator[] (const key_type& k)
{
return (*((this->insert(make_pair(k,mapped_type()))).first)).second;
}
operator[ ]函数实现是这样子的,将代码写得简洁明了一些就是下面这样
mapped_type& operator[](const key_type& key)
{
//利用make_pair函数插入一个键值对
//成功则返回新键值对的迭代器和true,失败则返回已存在键值对的迭代器和false
pair<iterator, bool> ret = this->insert(make_pair(key, mapped_type()));
//取出插入结果返回的迭代器,无论是否成功都会有一个迭代器返回
iterator it = ret.first;
//返回该迭代器指向键值对的第二个元素的引用
return it->second;
}
四、operator[ ]函数功能
根据上面operator[ ]函数介绍以及实现原理介绍,我们可以发现operator[ ]可以有以下四种用法
void test()
{
map<string, string> s;
//插入(对于map中不存在的数据,直接插入,返回string默认构造函数的默认值空串)
s["left"];
//插入并修改(对于map中不存在的数据,直接插入,返回string默认构造函数的默认值空串,我们可以再进行修改)
s["right"] = "右边";
//查找(对于map中存在的数据,返回键值对中第二个元素的引用,我们也可以用于数据查找)
cout << s["right"] << endl;
//修改(对于map中存在的数据,返回键值对中第二个元素的引用,我们可以直接修改)
s["left"] = "左边";
}