【问题标题】:How to use unordered_map of unordered_maps in c++?如何在 C++ 中使用 unordered_maps 的 unordered_map?
【发布时间】:2018-06-01 15:59:48
【问题描述】:

我有以下数据结构问题?你能帮帮我吗? 所以我的要求是在我将新数据项添加到此映射中时将此数据结构初始化为默认值。

我怎样才能有效地做到这一点?

对于我要添加的每个条目,我需要将 a1、a2、a3 设置为零。

struct a {
 int a1;
 int a2;
 int a3;
};

struct A {
 struct a A1;
 struct a A2;
};

unordered_map<int, unordered_map<int, struct A>> big_map;

尝试运行以下代码。

    unordered_map<int, struct A> inner_map;
    big_map[0] = inner_map;
    struct A m;
    big_map[0][0] = m;
    cout << "Values: " << big_map[0][0].A1.a1 << ", " << big_map[0][0].A1.a2 << ", " << big_map[0][0].A1.a3 << endl;

输出:

g++ -std=c++11 -o exe b.cc 。/可执行程序 值:0、0、1518395376 。/可执行程序 值:0、0、-210403408 。/可执行程序 值:0、0、-1537331360 。/可执行程序 值:0、0、-915603664

所以没有为 a3 进行默认初始化?

【问题讨论】:

  • @SombreroChicken 不需要,在 c++11 插入映射后会导致默认初始化,即使类型没有构造函数,例如整数、浮点数等。
  • @KostasRim 这是通用的答案,不包括 C++11。但话说回来unordered_map 只是 C++11,所以你是对的。

标签: c++ data-structures unordered-map


【解决方案1】:

从 C++11 开始,您可以这样做:

struct a {
 int a1 = 0;
 int a2 = 0;
 int a3 = 0;
};

【讨论】:

    【解决方案2】:

    您可以为结构添加默认构造函数:

    struct a {
        a() : a1(0), a2(0), a3(0) { }
        ...
    };
    
    struct A {
        A() : A1(), A2() { }
        ...
    };
    

    然后当你添加一个新结构时,你可以这样做:

    big_map[5][7] = A();
    

    【讨论】:

    • 我不明白为什么 A1() ?,A1 是可变的
    • @jpb123 A1 是一个结构对象。初始化列表中的A1() 显式调用其默认构造函数将a1, a2, a3 设置为0。
    • @jpb123 你的意思是在 A 的构造函数的初始化列表中吗?它默认初始化 A1 成员变量。
    • @scohe001,非常感谢。我不知道这一点。它有效。
    • @SeanBurton,A1(some_another_struct_a_variable) 使用 some_another_struct_a_variable 初始化 A1,A1() 使用默认构造函数初始化 A1。 .我说的对吗?
    【解决方案3】:

    你可以像类一样将构造函数赋予结构,并将其初始化为0

    struct a
    {
       int a1;
       int a2;
       int a3;
       a() : a1(0), a2(0), a3(0)
       {
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2013-03-10
      • 1970-01-01
      • 2020-05-14
      • 2017-04-27
      相关资源
      最近更新 更多