C++初始化对的映射

use*_*652 1 c++ stl initialization

我想静态初始化一个map<string, pair<some_enum, string> >.让我们说一个从员工ID到职位(枚举)+名称的地图.

我希望它看起来像这样:

map<string, pair<some_enum, string> > = {
  { "1234a", { BOSS, "Alice" }},
  { "5678b", { SLAVE, "Bob" }},
  { "1111b", { IT_GUY, "Cathy" }},
};
Run Code Online (Sandbox Code Playgroud)

在C++中执行此操作的最佳方法是什么?

cub*_*l42 6

C++ 11中的最佳方法:

std::map<string, pair<some_enum, std::string>> my_map = {
  { "1234a", { BOSS, "Alice" }},
  { "5678b", { SLAVE, "Bob" }},
  { "1111b", { IT_GUY, "Cathy" }},
};
Run Code Online (Sandbox Code Playgroud)

就这么简单.

如果不使用像boost这样的外部库,标准C++ 03中根本不可能.


cdh*_*wie 6

在C++ 11中,你所拥有的工作正常(假设你在变量声明中添加了一个标识符名称).

在之前的版本中,一种方法是使用构建地图的自由函数:

typedef std::map<std::string, std::pair<some_enum, std::string> > map_type;

static map_type create_map()
{
    map_type map;

    map["1234a"] = std::make_pair(BOSS, "Alice");
    map["5678b"] = std::make_pair(SLAVE, "Bob");
    map["1111b"] = std::make_pair(IT_GUY, "Cathy");

    return map;
}

map_type foo = create_map();
Run Code Online (Sandbox Code Playgroud)

或者你可以使用Boost.Assign:

std::map<std::string, std::pair<some_enum, std::string> > foo =
    boost::assign::map_list_of("1234a", std::make_pair(BOSS, "Alice"))
                              ("5678b", std::make_pair(SLAVE, "Bob"))
                              ("1111b", std::make_pair(IT_GUY, "Cathy"));
Run Code Online (Sandbox Code Playgroud)

  • @PiotrS.它们不是必需的; 编译器将推断模板类型参数.(这就是`std :: make_pair`的全部原因 - 如果你要自己指定模板类型参数,你可以直接使用`std :: pair`构造函数.) (2认同)
  • 如果我从SO那里学到了一件事,那就是永远不要说括号并期望人们知道你在说什么. (2认同)