插入 unordered_map 丢失了

Posted

技术标签:

【中文标题】插入 unordered_map 丢失了【英文标题】:insertion into unordered_map got lost 【发布时间】:2020-03-27 01:17:06 【问题描述】:

我有以下代码,但运行代码后,结果为空,任何想法为什么结果为空?函数 main 中结果的引用已传递给 myclass,我认为函数 addToResult 实际上会将数据添加到结果中,并且我期望映射键 =“测试”,值 =“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;

【问题讨论】:

“函数 main 中结果的引用已传递给 myclass”——太好了,它被复制到类成员 m_dltable 中。 “我认为函数 addToResult 实际上会将数据添加到结果中”——为什么?它将它添加到名为m_dltable 的类的成员中,它与构造函数的参数完全无关,它被复制到m_dltable 中。 C++ 不能以这种方式工作。仅仅因为 A 是从 B 初始化的,并不意味着对 A 的更改会自动复制到 B。现在,如果 m_dltable 本身是一个引用,那么情况就不同了。 你为什么要这样做呢?只需编写一个返回对m_dltable 的引用的getter 函数并使用它来迭代。那么你也不需要向构造函数传递任何东西。 @Slava A const 参考。否则你当然不会成功private @walnut 很抱歉反应过激,但是你需要小心你对新手程序员的建议,OP 已经尝试绕过封装,他的方法太天真了。 【参考方案1】:

让我们看看简化的例子:

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

c = 123;

最后的分配会修改a吗?当然不是。不管你如何通过引用将值传递给cc 是完全独立的变量,只是由引用初始化。

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

一般来说,您的方法是错误的。如果您想直接访问该变量,那么只需将其公开,不要尝试创建关于如何访问它的复杂解决方法。如果您想要封装,只需创建允许您迭代该容器的成员。例如返回一个对它的 const 引用,或者让 begin()end() 方法相应地返回 (const) 迭代器。

【讨论】:

以上是关于插入 unordered_map 丢失了的主要内容,如果未能解决你的问题,请参考以下文章

使用具有多个值的 unordered_map 移动插入

插入 unordered_map 时的 bad_alloc

有没有办法在 unordered_map 的某个位置插入元素?

在 Visual Studio 中放置并插入 unordered_map?

C++ 标准委员会是不是打算在 C++11 中 unordered_map 破坏它插入的内容?

unordered_map 的最坏情况是啥?