STL中map的下标操作解析

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小酥诶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值