插入 unordered_map 丢失了

insertion into unordered_map got lost

我有以下代码,但是在 运行 代码之后,结果是空的,知道为什么结果是空的吗?函数 main 中结果的引用已传递给 myclass,我认为函数 addToResult 实际上会向结果添加数据,我期待映射键 = "test",值 = "1": "1"。我对 C++ 有点陌生。谢谢!

#include <iostream>
#include <string>
#include <unordered_map>

using LookUpTable = std::unordered_map<std::string, std::string>;
using DLTable = std::unordered_map<std::string, LookUpTable>;

class MyClass
{
public:
    MyClass(DLTable& dltable) {
        m_dltable = dltable;
    };

    void addToResult() {
        LookUpTable ee;
        ee.emplace("1", "1");
        m_dltable.emplace("test", ee);
    };

 private:
    DLTable m_dltable;   
};


int main ()
{

  DLTable result;
  MyClass myclass(result);
  myclass.addToResult();

  std::cout << "myrecipe contains:" << std::endl;
  for (auto& x: result) {
        std::cout << x.first << ": "<< std::endl;
        for (auto& xx : x.second) {
            std::cout << xx.first << ": " << xx.second << std::endl;    
        }

  }
  std::cout << std::endl;
  return 0;
}

让我们看看简化的例子:

int a = 0;
int &b = a;
int c = b;

c = 123;

最后的赋值会修改 a 吗?当然不是。无论您如何通过引用将值传递给 c 都没有关系 c 是完全独立的变量,仅由引用初始化。

你的情况是一样的 - m_dltable 是单独的变量,你使用引用初始化它的事实不会改变任何东西。 (你的情况更糟,你没有通过引用初始化它,你赋值给它)

总的来说你的做法是错误的。如果您想直接访问该变量,那么只需将其设置为 public,不要尝试创建关于如何访问它的复杂变通方法。如果您想要封装,只需创建允许您迭代该容器的成员。例如 return 对它的 const 引用或具有 begin()end() 方法 return (const)相应地迭代器。