插入 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)相应地迭代器。
我有以下代码,但是在 运行 代码之后,结果是空的,知道为什么结果是空的吗?函数 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)相应地迭代器。