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
因为插入不可能失败