如何在C++中使用unordered_map的unordered_map?

3

我有一个数据结构问题,能帮我看一下吗?

我的要求是在向这个映射中添加新数据项时,将此数据结构初始化为默认值。

请问如何高效地实现此操作?

每次添加条目时,我需要将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 ./exe 值:0、0、1518395376 ./exe 值:0、0、-210403408 ./exe 值:0、0、-1537331360 ./exe 值:0、0、-915603664

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


3
不用那样做,在C++11中插入到map会导致默认初始化,即使该类型没有构造函数,比如int、float等。 - KostasRim
1
@KostasRim 这是泛化的答案,不包括C++11。但是unordered_map仅适用于C++11,所以你是正确的。 - Hatted Rooster
3个回答

6
自从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
1
@jpb123 A1 是一个结构体对象。初始化列表中的 A1() 显式地调用其默认构造函数将 a1, a2, a3 设置为 0。 - scohe001
@jpb123 你是指在 A 的构造函数的初始化列表中吗?它会默认初始化 A1 成员变量。 - Sean Burton
@scohe001,非常感谢。我之前不知道这个。它有效了。 - jpb123
@SeanBurton,A1(some_another_struct_a_variable)使用some_another_struct_a_variable初始化A1,而A1()使用默认构造函数初始化A1。我说得对吗? - jpb123
由于A是非POD类型(因为a有构造函数),所以您不需要构造函数,而且A1A2将被默认初始化 - Kevin

2
你可以像类一样给结构体提供构造函数,并将其初始化为0。
struct a
{
   int a1;
   int a2;
   int a3;
   a() : a1(0), a2(0), a3(0)
   {
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接