【问题标题】:How do I write a map literal in C++11? [duplicate]如何在 C++11 中编写地图文字? [复制]
【发布时间】:2013-12-12 08:45:03
【问题描述】:

在 Python 中,我可以像这样编写地图文字:

mymap = {"one" : 1, "two" : 2, "three" : 3}

如何在 C++11 中进行等效操作?

【问题讨论】:

    标签: c++ c++11 map literals


    【解决方案1】:

    你实际上可以这样做:

    std::map<std::string, int> mymap = {{"one", 1}, {"two", 2}, {"three", 3}};
    

    这里实际发生的是std::map 存储键值类型的std::pair,在本例中为std::pair&lt;const std::string,int&gt;。这只能是因为 c++11 的新统一初始化语法,在这种情况下调用 std::pair&lt;const std::string,int&gt; 的构造函数重载。在这种情况下,std::map 有一个带有 std::intializer_list 的构造函数,它负责外部大括号。

    因此,与 python 不同,您创建的任何类都可以使用此语法来初始化自身,只要您创建一个采用初始化列表的构造函数(或统一初始化语法适用)

    【讨论】:

    • 其实std::pair&lt;const std::string, int&gt;。但它们采用相同类型的初始化器。
    • @aschepler 好点修复了它,我猜关键总是给定一个 const 限定符
    • 我认为这不准确。 {"one",1} 是统一初始化(如果 std::pair 实际上是 POD,甚至可能 聚合初始化)。只有外部的 {} 是初始化列表。由于统一初始化,它仍然工作(否则需要mymap({ {a,b}, {c,d} })
    • @sehe 将其称为初始化列表仍然有效,但我将编辑答案以使其更清晰
    • @aaronman 实际上不是。事实上,重载决议在存在初始化列表的情况下是非常具体的,因此区分非常好(采用初始化列表的签名总是首选用于统一初始化;统一初始化not 暗示一个初始化列表)
    【解决方案2】:

    你可以这样做:

    std::map<std::string, int> mymap = {{"one", 1}, {"two", 2}, {"three", 3}};
    

    【讨论】:

    • 你为什么自言自语?
    • 我在 SO 上找不到答案,所以我添加了它以节省其他程序员一些时间。 SO实际上鼓励这样做:stackoverflow.com/help/self-answer
    • @abw333 可以说这不是针对琐事“查找”参考样式问题...想象一下“我如何在 Jquery 中添加两个数字”(有趣的是:Adding numbers in Jquery :)跨度>
    • @sehe 我只是想帮忙。我花了几分钟谷歌搜索并没有成功,最终不得不请人找出答案。我没有在 SO 上看到它,所以我发布了这个,以便更容易找到答案。
    • 您不应该在 SO 中分享您对语言 x 与语言 y 的个人意见。这种语法很好,因为与 Python 不同,std::map 不是核心语言中的内置类型,它是静态类型而不是动态类型。这就像把苹果比作汽车。
    猜你喜欢
    • 2020-05-09
    • 2013-12-30
    • 2015-12-14
    • 1970-01-01
    • 2012-06-19
    • 2013-08-17
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多