STL中map的下标操作解析
创始人
2025-05-31 23:54:13

map下标操作的效果展示

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是关键字

  • 1.如果key不在map对象里,那么就使用key构建一个键值对, 插入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 类型,也就是说调用这个函数后, 会返回一个键值对。该键值对的关键字是一个迭代器,对于这个迭代器:

  • (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下标操作呈现出如此效果的原因。

相关内容

热门资讯

福建平和:“世界柚乡”挂满“致... (来源:千龙网)新华社福州12月17日电 题:福建平和:“世界柚乡”挂满“致富金果”新华社记者吴剑锋...
于细微处见担当 在窗口处绽光彩 清晨的阳光透过玻璃窗,洒在办公桌码放整齐的文件上。马彦超翻开待处理工作的文件夹,指尖划过一行行文字,...
水墨乡村景如画 (来源:市场星报) 安徽省黄山市黟县宏村镇冬景如画,晨雾如轻纱般缭绕于白墙黛瓦的徽派民居之间,阳光穿...
从慈禧照片看晚清社会 慈禧与众人在颐和园乐寿堂前慈禧与外国公使夫人合影慈禧中海泛舟假扮观音十九世纪四十年代,西方出现了摄影...