c++ - C++ 值作为映射:第二个映射中的值未更新
问题描述
我有一个std::map
与价值作为另一张地图。我想更新内部地图的值。
当内部地图值更新并立即打印时,它会显示更新后的值。但是在那之后,当调用显示函数时,它不会显示更新的值。不知道我错过了什么。
#include <iostream>
#include <map>
typedef std::map <std::string, std::string> poolNameApnNameT;
struct A
{
struct S
{
std::map <std::string, poolNameApnNameT>apnPoolValidationDb;
}s;
void PrintfMe();
};
void A::PrintfMe()
{
for(auto x: s.apnPoolValidationDb) {
std::cout << "main: " << x.first << std::endl;
for (auto y: x.second)
std::cout << "Inner: " << y.first << " " << y.second << std::endl;
}
}
int main()
{
A a;
a.s.apnPoolValidationDb.emplace(
std::make_pair((char*)"pool1",
poolNameApnNameT({ std::make_pair((char*)"pool2","xx")})
));
a.s.apnPoolValidationDb.emplace(
std::make_pair((char*)"pool2",
poolNameApnNameT({ std::make_pair((char*)"pool1","zz")})
));
a.PrintfMe();
/* search key and updated value's value(inner map).*/
for (auto search: a.s.apnPoolValidationDb) {
auto search2 = search.second.find("pool2");
if(search2 != search.second.end()) {
std::cout << "found: " << search2->first << std::endl;
std::cout << "Updating: " << search2->second << std::endl;
search2->second.assign((char*)"yy"); // Update using assign()
std::cout << "After Update " << search2->second << std::endl;
search.second[search2->first] = "OO"; // Update using []
std::cout << "After Update " << search2->second << std::endl;
}
}
std::cout << std::endl;
a.PrintfMe();
}
输出:
main: pool1
Inner: pool2 xx
main: pool2
Inner: pool1 zz
found: pool2
Updating: xx
After Update yy
After Update OO
main: pool1
Inner: pool2 xx <<< should be OO instead of xx
main: pool2
Inner: pool1 zz
解决方案
问题出在这一行:
for(auto search: a.s.apnPoolValidationDb)
这是外部映射中键值对的范围循环。但请注意变量声明!您的search
变量被声明为auto
,而不是auto&
。因此,您实际上是在此循环的每次迭代中制作内部映射的副本。您正在更新副本,而不是原件;当您继续下一次迭代时,副本将被丢弃。原始外图保持不变。
推荐阅读
- c - 预期标识符 caesar.c 1 错误括号
- sql - 如何使来自两个不同表的两个非常相似的列显示在主表的相同主键下
- java - 使用单例 MainActivity?
- python-2.7 - 端点调用者没有权限
- android - 在构建 apk 后对未显示的本机图像做出反应
- reactjs - React.js 在映射表单上设置状态
- ruby-on-rails - 如何根据 ruby 中的字符串生成非随机 UUID?
- sharepoint - 安装更新后升级-SPContentDatabase 失败
- javascript - 浏览器扩展隐藏的 bootstrap-4.1.3 固定底部窗口
- python - ValueError:在尝试检测汽车铭牌时,在 openCV 中解压的值太多(预期为 2)