如何使用初始化列表初始化inordered_map <string,unordered_set <string >>成员?

时间:2019-06-26 12:40:50

标签: c++ c++11 unordered-map initializer-list unordered-set

我有这堂课

class A {
    unordered_map<string, unordered_set<string>> n_;
  public:
    A(unordered_map<string, unordered_set<string>>& n) : n_{n} {}
};

我希望能够使用具有该语法的构造函数

int main() {
    A a{{"C", {"A", "B"}}};
    return 0;
}

但是按照现在的方式写,我出错了

error: no matching function for call to `‘A::A(<brace-enclosed initializer list>)’ A a{{"C", {"A", "B"}}};`

如何解决?

4 个答案:

答案 0 :(得分:7)

您需要为此再添加一个{}。并注意,临时不能绑定到非常量的左值引用。 (它们可以绑定到const或rvalue-references的左值引用。)例如

class A {
    unordered_map<string, unordered_set<string>> n_;
  public:
    A(const unordered_map<string, unordered_set<string>>& n) : n_{n} {}
    //^^^^^
};

int main() {
    A a{{{"C", {"A", "B"}}}};
    //          ^^^  ^^^     elements of unordered_set
    //         ^^^^^^^^^^    for the unordered_set
    //   ^^^^^^^^^^^^^^^^^   elements (std::pair) of unordered_map (only one here)
    //  ^^^^^^^^^^^^^^^^^^^  for the unordered_map
    // ^^^^^^^^^^^^^^^^^^^^^ for A

    return 0;
}

我想您可能会错过{}的元素(std::pair)的unordered_map;以类似的方式,如果要使unordered_map包含两个元素,可以将其写为

A b{{{"C", {"A", "B"}}, {"F", {"D", "E"}}}};

LIVE

答案 1 :(得分:4)

  

我希望能够使用具有该语法的构造函数

您可以提供一个 std::initializer_list 构造函数来完成这项工作

#include <initializer_list>

class A
{
    using MapType = std::unordered_map<std::string, std::unordered_set<std::string>>;
    MapType n_;
public:
    A(std::initializer_list<MapType::value_type> n) : n_{ n } {}
    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
};

的优点在于,列表初始化不需要额外的一对{} 。 例如,具有两个条目的地图:

A a{
    {"C", {"A", "B"}},
    {"D", {"E", "F"}},
}; // do not require extra braces now!

See Live

答案 2 :(得分:3)

在Jarod的(正确)答案之上,您缺少一套花括号:

int main() {
    A a{{{"C", {"A", "B"}}}};
    return 0;
}

从最内层开始:

您需要初始化std::unordered_set

{"A", "B"}

std::pair实例中使用该设置

{"C", {"A", "B"}}

使用该对来初始化std::unordered_map

{{"C", {"A", "B"}}}

使用该映射初始化A的对象:

A a{{{"C", {"A", "B"}}}};

答案 3 :(得分:2)

临时不能绑定到非常量(左值)引用。

您可以将构造函数更改为

A(const unordered_map<string, unordered_set<string>>& n) : n_{n} {}

A(unordered_map<string, unordered_set<string>>&& n) : n_{std::move(n)} {}

A(unordered_map<string, unordered_set<string>> n) : n_{std::move(n)} {}