c++ map operator[]

13 篇文章 0 订阅

        map 的 operator[] 不仅是简单的下标方式访问元素,还可以修改元素,甚至可以插入新元素。

1,访问元素

最简单不过的就是下标方式访问元素,类似数组的下标方式,如:

#include <iostream>
#include <map>
#include <stdio.h>
#include <string.h>
#include <string>


int main()
{  
    std::map<int, int> mInternal;
    mInternal.insert(std::pair<int, int>(0, 1));
    mInternal.insert(std::pair<int, int>(1, 2));
    mInternal.insert(std::pair<int, int>(2, 3));

    for(size_t i = 0; i < mInternal.size(); i++)
    {
        printf("%d -> %d\n", i, mInternal[i]);
    }
    return 0;
}

2,修改元素

因为这个重载操作符返回的是匹配key的元素的引用,所以可以很方便地进行元素值的修改,如:

#include <iostream>
#include <map>
#include <stdio.h>
#include <string.h>
#include <string>


int main()
{  
    std::map<int, int> mInternal;
    mInternal.insert(std::pair<int, int>(0, 1));
    mInternal.insert(std::pair<int, int>(1, 2));
    mInternal.insert(std::pair<int, int>(2, 3));

    mInternal[2] = 200;
    for(size_t i = 0; i < mInternal.size(); i++)
    {
        printf("%d -> %d\n", i, mInternal[i]);
    }
    return 0;
}

mInternal[2] = 200; 将 key=2 的值修改为了 200,结果为:

3,插入新元素

         也许有人会疑惑这个操作怎么可以插入新元素呢?我们查看 用法 后会发现,当用 [k] 操作时,如果 k 与容器中任何元素的键不匹配,该函数将插入一个具有该键的新元素,并返回对其映射值的引用。注意,这总是将容器大小增加1,即使没有为元素分配映射值(使用默认构造函数构造元素)。

#include <iostream>
#include <map>
#include <stdio.h>
#include <string.h>
#include <string>


int main()
{  
    std::map<int, int> mInternal;
    mInternal.insert(std::pair<int, int>(0, 1));
    mInternal.insert(std::pair<int, int>(1, 2));
    mInternal.insert(std::pair<int, int>(2, 3));

    mInternal[2] = 200;
    
    //会插入一个新元素,调用int的默认构造函数构造元素
    int value = mInternal[3];
    
    for(size_t i = 0; i < mInternal.size(); i++)
    {
        printf("%d -> %d\n", i, mInternal[i]);
    }
    return 0;
}

int value = mInternal[3]; 这句本来的目的是想访问 key = 3 的元素,结果意外的插入了一个新的元素,其值为0。如果是其他基本类型 float, double, char 呢?

#include <iostream>
#include <map>
#include <stdio.h>
#include <string.h>
#include <string>


int main()
{  
    std::map<int, float> mInternal;
    mInternal.insert(std::pair<int, float>(0, 1.1));
    mInternal.insert(std::pair<int, float>(1, 2.2));
    mInternal.insert(std::pair<int, float>(2, 3.3));

    mInternal[2] = 200.2;
    
    //会插入一个新元素,调用int的默认构造函数构造元素
    int value = mInternal[3];

    for(size_t i = 0; i < mInternal.size(); i++)
    {
        printf("%d -> %f\n", i, mInternal[i]);
    }

    std::map<int, char> mapChar;
    mapChar.insert(std::pair<int, float>(0, 'a'));
    mapChar.insert(std::pair<int, float>(1, 'b'));

    char ch = mapChar[2];
    for(size_t i = 0; i < mapChar.size(); i++)
    {
        printf("%d -> %c\n", i, mapChar[i]);
    }

    return 0;
}

如果是std::string类型呢?

#include <iostream>
#include <map>
#include <stdio.h>
#include <string.h>
#include <string>


int main()
{  
    std::map<int, std::string> mInternal;
    mInternal.insert(std::pair<int, std::string>(0, "1"));
    mInternal.insert(std::pair<int, std::string>(1, "2"));
    mInternal.insert(std::pair<int, std::string>(2, "3"));

    mInternal[2] = "200";
    
    //会插入一个新元素,调用int的默认构造函数构造元素
    std::string str = mInternal[3];
    
    for(size_t i = 0; i < mInternal.size(); i++)
    {
        printf("%d -> %s\n", i, mInternal[i].c_str());
    }
    return 0;
}

 

 std::string 默认构造为空字符串。

如果是自定义类型呢?

#include <iostream>
#include <map>
#include <stdio.h>
#include <string.h>
#include <string>

struct internal
{
    internal(): index(100), value(0), name("")
    {

    }
    
    internal(int i, int v, std::string s): index(i), value(v), name(s)
    {

    }
    int index;
    int value;
    std::string name;
};


int main()
{  
    internal test(1, 2, "tset");
    std::map<std::string, internal> mInternal;
    mInternal["1111"] = test;

    internal test2(2, 3, "test2");
    mInternal["2222"] = test2;
    int idx = mInternal["3333"].index; //下标访问没有对应的key时,新插入一个元素,元素调用默认构造函数生成
    printf("idx = %d\n", idx);
    
    for(auto ite : mInternal)
    {
        printf("map[%s] = %d\n", ite.first.c_str(), ite.second.index);
    }

    return 0;
}

int idx = mInternal["3333"].index; 这一句本是想获取 key = "3333" 元素的 index,却意外也插入了一个元素,而元素是调用 struct internal 的默认构造函数生成的,结果为:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值