【问题标题】:insertion into unordered_map got lost插入 unordered_map 丢失了
【发布时间】: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 已经尝试绕过封装,他的方法太天真了。

标签: c++ pointers reference unordered-map


【解决方案1】:

让我们看看简化的例子:

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

c = 123;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多