c++中结构体作为map的value及两种遍历方式的区别

c++中结构体作为map的value及两种遍历方式的区别

有时候需使用结构体作为map的value。但是,修改value中结构体成员的值得时候,如果使用了Range-Based-For方式遍历找到需要修改的元素,并对结构体成员赋值,该操作并不能实现对结构体成员的修改。

示例程序

#include <iostream>
#include <map>
#include <string>

typedef struct 
{
    std::string astr = "";
    int bint = 0;
} TestStruct;

int main ()
{
    std::map < int,TestStruct > testMap;
    TestStruct t1{"a",1};
    testMap[1] = t1;
    TestStruct t2{"b",2};
    testMap[2] = t2;
    for (auto prmlter:testMap)
    {
        prmlter.second.astr = "c";
        prmlter.second.bint = 3;
    }
    
    for (auto prmlter:testMap)
    {
        printf ("map[%d] astr:%s bint:%d\n", prmlter.first, prmlter.second.astr.c_str (), prmlter.second.bint);
    }

    return 0;
}

程序中定义了一个名为 TestStruct 的结构体,其中包含一个字符串成员 astr 和一个整数成员 bint。程序中创建了两个 TestStruct 对象 t1 和 t2,并将它们分别插入到 testMap 中的不同位置。接下来使用 Range-Based-For方式循环遍历 testMap 中的每个元素。在循环中,对每个元素的结构体成员赋值。最后,输出每个元素的值。输出结果如下:
在这里插入图片描述

可以看到 对 astr 和 bint的赋值并没有成功。

ChatGPT分析问题

使用ChatGPT(非plus)帮忙分析这段代码的问题,直接将代码粘贴个给ChatGPT并提问:“这段代码是否存在问题”:
在这里插入图片描述

ChatGPT的回答:
在这里插入图片描述

ChatGPT准确理解了问题,并看懂了这段代码,分析出了代码的问题和原因,并给出了解决办法(给个好评)。

直接复制ChatGPT给出的代码,运行结果如下:
在这里插入图片描述

可以看到赋值操作成功生效。

总结

在使用结构体作为map的value时,如果需要修改结构体成员的值,使用Range-Based-For方式遍历找到需要修改的元素,并对结构体成员赋值,该操作并不能实现对结构体成员的修改。这是因为Range-Based-For方式循环遍历map时,返回的是一个对象的副本,而不是对象的引用。因此,在修改结构体成员时,应该使用迭代器方式循环遍历。这样,返回的就是对象的引用,可以成功修改结构体成员的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值