map下标操作的效果展示
STL中:map可以使用下标进行操作,set则不可以。
void TestMap()
{
map<string, int> m;
m.insert(pair<string, int>("苹果", 8));
m.insert(pair<string, int>("西瓜", 12));
m.insert(pair<string, int>("草莓", 3));
m.insert(pair<string, int>("甘蔗", 9));
m["橘子"];
m["香蕉"] = 3;
m["苹果"] = 5;
map<string, int>::iterator it = m.begin();
while (it != m.end())
{
cout << it->first << ": " << it->second << endl;
it++;
}
}
使用map对象 + ["key"]
, key是关键字
- 1.如果key不在map对象里,那么就使用key构建一个键值对
<key, ElemType()>
, 插入map对象; - 2.如果key不在map对象,在(1)的基础上,可以在
map对象 + ["key"]
后面加上= XXX, 将key作为关键字的键值对里的值修改成XXX。。 - 3.如果key在map对象里了,在
map对象 + ["key"]
后面加上= XXX, 将key作为关键字的键值对里的值修改成XXX。
map对象的下标操作能够达到这样效果的原因
map中对下标操作符[]进行了重载,实际上就是调用了
mapped_type& operator[] (const key_type& k);
而调用这个函数等价于
(*((this->insert(make_pair(k,mapped_type()))).first)).second
这段带上去非常复杂,实际上并没有很强的逻辑。我们逐层地进行分析:
首先看最内部的东西
第一层次:
make_pair(k,mapped_type())
使用map[k]中的k作为关键字,并且创建了一个匿名对象作为值,构建出一个{k,mapped_type()}
的键值对。
第二层:
this->insert(make_pair(k,mapped_type()))
将构建的键值对{k,mapped_type()}
插入到调用这个函数的map对象中。
到这里,我们必须清楚map类对象调用insert
函数,insert函数返回值是pair<iterator,bool>
类型,也就是说调用这个函数后, 会返回一个键值对。该键值对的关键字是一个迭代器,对于这个迭代器:
- (1)如果原来的map对像中没有,可以成功插入键值对,返回成功插入键值对位置的迭代器。
- (2)如果原来的map对象中有,直接返回已经存在的以
k
作为关键字的键值对, 的迭代器。
第三层:
(this->insert(make_pair(k,mapped_type()))).first
获取到第二层所阐述的迭代器。
第四层:
*((this->insert(make_pair(k,mapped_type()))).first)
获取到第二层阐述的迭代器所指向的键值对,这个键值对是最开始,map[k]中以k作为关键字的键值对
第五层(最后一层):
(*((this->insert(make_pair(k,mapped_type()))).first)).second
获取到此时map[k]中以k作为关键字的键值对的第二个元素,也就是键值对的value.
再来回看所调用的函数
mapped_type& operator[] (const key_type& k);
它返回的是,键值对中value的引用。
综上,便是map下标操作呈现出如此效果的原因。