【问题标题】:C++ value as map: Value is not updating in second mapC++ 值作为映射:第二个映射中的值未更新
【发布时间】:2020-12-03 08:21:54
【问题描述】:

我有一个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

【问题讨论】:

  • 1.请从源中删除行号。 2.我不太明白你的最后三行。预期的输出是什么,你得到的输出是什么?使用“代码段”(三重引号的缩进)来区分您的解释和输出。
  • for(auto search => for(auto&amp; search
  • 呸!!谢谢!! @n.'代词'm.
  • @AmitKasturi:下一次,请尽量简化你的程序。这个程序有一个无用的包装 A 类和 s 结构,这是不必要的。而且你交替使用“pool1”和“pool2”,这让我更加困惑。

标签: c++ for-loop c++11 stdmap c++-standard-library


【解决方案1】:

问题出在这一行:

for(auto search: a.s.apnPoolValidationDb)

这是一个针对外部映射中键值对的 ranged-for 循环。但请注意变量声明!您的search 变量被声明为auto,而不是auto&amp;。因此,您实际上是在此循环的每次迭代中复制内部地图。您正在更新副本,而不是原始版本;当您继续下一次迭代时,副本将被丢弃。原外图保持不变。

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多