zoukankan      html  css  js  c++  java
  • 【C++容器】key相同的键值对插入map时的覆盖问题

    1.问题

    问:当map插入数据时,如果key相同,value会被覆盖么?

    答:map容器插入键值对的方法一般有两种:

    1. map["key"] = value;                   //  [] =  方法:通过 map[key] = value 实现覆盖,进行数据的更新
    2. map.insert(make_pair<>(key, value));  // insert 方法:先判断map中是否存在相同的key,若存在则放弃插入操作,直接返回;若不存在,执行插入操作
    • 使用方法一插入相同键的键值对时,后一组的键值对会覆盖(替换)前一组键值对。代码如下:
    #include <map>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    // []= 方式是可以覆盖的 map
    <double, double> mp1; mp1[1.0] = 1.1; mp1[1.0] = 1.2; cout << mp1.size() << endl; cout << mp1.begin()->second << endl; return 0; }

    输出结果为:

    1
    1.2
    • 使用方法二插入相同键的键值对时,后一组的键值对不会插入map容器,即不会覆盖前一组键值对。代码如下:
    #include <map>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
     // insert方式,重复的key会直接被放弃,而不是进行覆盖(这一点与Java不同) map
    <double, double> mp1; mp1.insert(make_pair<double, double>(2.0, 2.1)); mp1.insert(make_pair<double, double>(2.0, 2.2)); cout << mp1.size() << endl; cout << mp1.begin()->second << endl; return 0; }

    输出结果为

    1
    2.1

     2.解释

    • insert()不能覆盖的原因

       map源码中,insert()方法的定义:

    1 pair<iterator,bool> insert(const value_type& __x)          // 可以通过返回的pair中第二个bool型变量来判断是否插入成功。
    2     { return _M_t.insert_unique(__x); }

    调用 _M_t.insert_unique(__x) 方法,该方法会首先遍历整个集合,判断是否存在相同的key,如果存在则直接返回,放弃插入操作;如果不存在,进行插入操作。
    而 [ ] = 方式是通过重载[]操作符来实现的,它直接进行插入或者覆盖。

    • 判断map中key值是否存在

    1)count()函数
    count函数统计key值在map中出现的次数,map的key不允许重复,因此如果key存在返回1,不存在返回0。

    1 if (testMap.count(key) == 0)
    2    cout << "no this key" << endl;

    2)find()函数
    对于STL中的容器,有泛型算法 find(begin,end,target) 查找目标,map还提供了一个成员方法 find(key)
    如果key存在,则find返回key对应的迭代器,如果key不存在,则find返回尾后迭代器 .end()。

    1 // iterator find ( const key_type& key );
    2 
    3 if (testMap.find(key) == testMap.end())
    4     cout << "no this key" << endl;
    • 不判断key的存在,直接返回map[key]会怎样

    该做法不严谨!如果map中包含key,可以直接返回map[key];如果map不包含key,会在map中插入一个key的元素,value取默认值,返回value,那么map[key]不会返回null。
    应该采用以下两种写法:

    /*1、count()方法*/
     if(m.count(key)>0)
     {
         return m[key];
     }
     return null;
    
    /*2、find()方法*/
     iter = m.find(key);
     if(iter!=m.end())
     {
         return iter->second;
     }
    return null;

    【注】两种方法差别:第一种需要执行两次查找,效率低,推荐使用第二种方法。

    来源:

    https://blog.csdn.net/weixin_45758146/article/details/107798449

  • 相关阅读:
    残奥会女坐式排球决赛
    Visual C++ 调试器伪变量
    Project Chameleon Work In Progress 3
    pku1496 Word Index
    pku1083 Moving Tables
    pku3273 Monthly Expense
    pku1189 钉子和小球
    pku1018 Communication System
    关于tomcat报Error listenerStart和Context [*] startup failed due to previous errors两个错误的总结 东师理想
    java客户端提交数据到memcached方法memcached+java+client个人总结 东师理想
  • 原文地址:https://www.cnblogs.com/SchrodingerDoggy/p/14605152.html
Copyright © 2011-2022 走看看