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时,返回的是一个对象的副本,而不是对象的引用。因此,在修改结构体成员时,应该使用迭代器方式循环遍历。这样,返回的就是对象的引用,可以成功修改结构体成员的值。