【问题标题】:C++ initialize map of pairs [duplicate]C ++初始化对的映射[重复]
【发布时间】:2014-10-16 16:00:28
【问题描述】:

我想静态初始化一个map<string, pair<some_enum, string> >。假设是一张从员工 ID 到职位(枚举)+ 姓名的映射。

我希望它看起来像这样:

map<string, pair<some_enum, string> > = {
  { "1234a", { BOSS, "Alice" }},
  { "5678b", { SLAVE, "Bob" }},
  { "1111b", { IT_GUY, "Cathy" }},
};

在 C++ 中最好的方法是什么?

【问题讨论】:

  • 最好的方法是你如何拥有它。我也喜欢你按职称排序的方式。
  • Works for me。似乎是什么问题?
  • 如果您使用与 C++11 标准兼容的编译器,这应该可以工作。

标签: c++ stl initialization


【解决方案1】:

C++11 中的最佳方式:

std::map<string, pair<some_enum, std::string>> my_map = {
  { "1234a", { BOSS, "Alice" }},
  { "5678b", { SLAVE, "Bob" }},
  { "1111b", { IT_GUY, "Cathy" }},
};

就这么简单。

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

【讨论】:

  • C++03 还不错。类似boost::whatever_map_list_of("1234a", std::make_pair(BOSS, "Alice"))("5678b", …)
  • 嗯,我在考虑标准 C++。我会让其他人谈谈提升,因为我没有太多经验。
【解决方案2】:

在 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();

或者你可以使用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"));

【讨论】:

  • (make_pair 后面缺少括号)
  • @PiotrS。它们不是必需的;编译器将推断模板类型参数。 (这就是std::make_pair 的全部原因——如果您要自己指定模板类型参数,您可以直接使用std::pair 构造函数。)
  • 我的意思是 () 括号,而不是
  • @PiotrS。啊,你的意思是parens。很好,我会解决的。
  • 如果我从 SO 中学到了一件事,那就是永远不要说括号并期望人们知道你在说哪种括号。
猜你喜欢
  • 2012-03-02
  • 2021-12-31
  • 1970-01-01
  • 2015-12-03
  • 2014-01-09
  • 2020-01-14
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多