STL中:map可以使用下标进行操作,set则不可以。
void TestMap()
{map m;m.insert(pair("苹果", 8));m.insert(pair("西瓜", 12));m.insert(pair("草莓", 3));m.insert(pair("甘蔗", 9));m["橘子"];m["香蕉"] = 3;m["苹果"] = 5;map::iterator it = m.begin();while (it != m.end()){cout << it->first << ": " << it->second << endl;it++;}
}
使用map对象 + ["key"]
, key是关键字
, 插入map对象;map对象 + ["key"]
后面加上= XXX, 将key作为关键字的键值对里的值修改成XXX。。map对象 + ["key"]
后面加上= XXX, 将key作为关键字的键值对里的值修改成XXX。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
类型,也就是说调用这个函数后, 会返回一个键值对。该键值对的关键字是一个迭代器,对于这个迭代器:
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下标操作呈现出如此效果的原因。