插入 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
吗?当然不是。不管你如何通过引用将值传递给c
,c
是完全独立的变量,只是由引用初始化。
你的情况是一样的 - m_dltable
是单独的变量,你使用引用初始化它的事实不会改变任何东西。 (你的情况更糟,你没有通过引用初始化它,你分配给它)
一般来说,您的方法是错误的。如果您想直接访问该变量,那么只需将其公开,不要尝试创建关于如何访问它的复杂解决方法。如果您想要封装,只需创建允许您迭代该容器的成员。例如返回一个对它的 const 引用,或者让 begin()
和 end()
方法相应地返回 (const) 迭代器。
【讨论】:
以上是关于插入 unordered_map 丢失了的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 unordered_map 的某个位置插入元素?
在 Visual Studio 中放置并插入 unordered_map?