【发布时间】:2013-12-12 08:45:03
【问题描述】:
在 Python 中,我可以像这样编写地图文字:
mymap = {"one" : 1, "two" : 2, "three" : 3}
如何在 C++11 中进行等效操作?
【问题讨论】:
在 Python 中,我可以像这样编写地图文字:
mymap = {"one" : 1, "two" : 2, "three" : 3}
如何在 C++11 中进行等效操作?
【问题讨论】:
你实际上可以这样做:
std::map<std::string, int> mymap = {{"one", 1}, {"two", 2}, {"three", 3}};
这里实际发生的是std::map 存储键值类型的std::pair,在本例中为std::pair<const std::string,int>。这只能是因为 c++11 的新统一初始化语法,在这种情况下调用 std::pair<const std::string,int> 的构造函数重载。在这种情况下,std::map 有一个带有 std::intializer_list 的构造函数,它负责外部大括号。
因此,与 python 不同,您创建的任何类都可以使用此语法来初始化自身,只要您创建一个采用初始化列表的构造函数(或统一初始化语法适用)
【讨论】:
std::pair<const std::string, int>。但它们采用相同类型的初始化器。
{"one",1} 是统一初始化(如果 std::pair 实际上是 POD,甚至可能 聚合初始化)。只有外部的 {} 是初始化列表。由于统一初始化,它仍然工作(否则需要mymap({ {a,b}, {c,d} }))
你可以这样做:
std::map<std::string, int> mymap = {{"one", 1}, {"two", 2}, {"three", 3}};
【讨论】:
std::map 不是核心语言中的内置类型,它是静态类型而不是动态类型。这就像把苹果比作汽车。