C++ map/set (2)

1.函数insert

map和set返回值都是pair函数 

pair的first是迭代器  second是布尔值 插入成功就是true  失败就是false

我们写一个map统计元素出现的次数  但是很麻烦

string arr[] = { "西瓜", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
map<string, int> countMap;
for (auto e : arr)
{
	auto it = countMap.find(e);
	if (it == countMap.end())
	{
		countMap.insert(make_pair(e, 1));
	}
	else
	{
		it->second++;
	}
}
for (const auto& kv : countMap)
{
	cout << kv.first << ":" << kv.second << endl;
}

那么有没有更简单的方法呢?

答案是有 就是operator[]

2.函数opertor[]

[ ]里面给的是key  但是返回的是value

同时等价于 

因此我们知道[ ]是通过insert来实现的  通过insert的返回值的first(迭代器) 对其*得到的second(value)

这个value  如果树里已存在  就是树;里面的那个   如果是树里面没有的

返回的就是新插入的节点的value

和下面这个是等价的

((this->insert(make_pair(k,mapped_type()))).first)->second

如果我们插入两个key相同 但是value不同的值是时会怎样

第二个插入的值会把第一个覆盖掉吗?

答案是不会  因为第二个插入的时候 检测到两个key相同时就不会执行插入

因此我们上面的代码就可以优化的很简单

string arr[] = { "西瓜", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
	map<string, int> countMap;
	
	for (auto e : arr)
	{
		countMap[e]++;
	}

	for (const auto& kv : countMap)
	{
		cout << kv.first << ":" << kv.second << endl;
	}

插入之后返回插入(或原有)的地址,地址++再接着插入

4.opertor[ ]的模拟实现

 这个地方为什么是V()

因为这个地方不同类型 的缺省值不一样   比如int的就是0   string的又不一样

根据[ ]的特点 我们可以实现很多功能 比如下图这些       

3.multimap 

multimap和map的区别     和       set   和   multiset的区别差不多

但是区别是multimap没有operator[ ]

毕竟一个key可以有多个value  那返回哪个value呢?

而且multimap的insert返回值不是pair了  而直接是iterator

因为插入不可能失败

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值