C++如何更好地初始化一个嵌套的map?

4

我今天刚开始学习C++,在初始化一个映射的映射时遇到了困难。目前,使用的方法非常糟糕:

typedef std::map < char, map < char, int > >  terribly_initialised_map;

然后

terribly_initialised_map plz_help;
plz_help['m']['e'] = 1;
....
...
..
.

一定有更好的方法吧?


你能解释一下这里有什么问题,以及你期望一个更好的解决方案是什么吗? - Christophe
对于字符串映射,您可以通过{}符号在一行中完成。使用这种方式会使定义常量全局变量更加笨拙/棘手(可能是错误的,但我没有经验)。此外,对于大型映射,它也很笨拙。 - user3684792
1个回答

10
在C ++11中,这变得容易了很多:
map_type someMap{
    {'m', {
        {'e', 1},
        {'f', 2}
    }},
    {'a', {
        {'b', 5}
    }}
};

这里使用了列表初始化,使用了std::map的列表构造函数(接受一个std::initializer_list<std::pair<Key, Value>>)。这些键值对也可以通过列表初始化来存储两个值。
在C++03中,你可以使用boost::map_list_of,但是对于嵌套映射,它可能不比你已有的方法更好,特别是外部调用需要是一个特定的list_of调用以消除歧义。
using boost::assign::list_of;
using boost::assign::map_list_of;
map_type someMap = 
    list_of<map_type::value_type>
    ('m', 
        map_list_of
        ('e', 1)
        ('f', 2)
    )
    ('a', 
        map_list_of
        ('b', 5)
    )
;

大括号不匹配。 - Don Reba
你有关于这个的文档吗?我在互联网上搜索不到任何东西。 - user3684792
在顶层声明符之后仍然得到了预期的';'。这是因为我的C ++版本吗? - user3684792
@user3684792,我添加了一些解释。如果您愿意,可以将其添加到自己的类中,但是标准容器都很好地利用了它,而且最终可以只需 return {blah}; 而不必再次声明类型。目前我的答案在 Clang 中可以编译通过。请确保启用了 C++11 支持(-std=c++11)并且编译器支持统一初始化和初始化列表。 - chris
啊,我下载的 Eclipse 不支持这个功能,所以我一直在 IDE 中运行。谢谢。 - user3684792

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