如何使用初始化列表初始化 unordered_map<string, unordered_set<string>> 成员?
How to initialize unordered_map<string, unordered_set<string>> members using initializer list?
我有这个class
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"}}};`
如何修复?
暂时无法绑定到 non-const(左值)引用。
您可以将构造函数更改为
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)} {}
您需要为其添加一个 {}
。并注意临时不能绑定到 lvalue-reference 到 non-const。 (它们可以绑定到 lvalue-references 到 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;
}
我想您可能会错过 unordered_map
的元素 (std::pair
) 的 {}
;以类似的方式,如果你想让 unordered_map
包含两个元素,你可以把它写成
A b{{{"C", {"A", "B"}}, {"F", {"D", "E"}}}};
I want to be able to use the constructor with that syntax
您可以提供一个 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)
除了 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"}}}};
我有这个class
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"}}};`
如何修复?
暂时无法绑定到 non-const(左值)引用。
您可以将构造函数更改为
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)} {}
您需要为其添加一个 {}
。并注意临时不能绑定到 lvalue-reference 到 non-const。 (它们可以绑定到 lvalue-references 到 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;
}
我想您可能会错过 unordered_map
的元素 (std::pair
) 的 {}
;以类似的方式,如果你想让 unordered_map
包含两个元素,你可以把它写成
A b{{{"C", {"A", "B"}}, {"F", {"D", "E"}}}};
I want to be able to use the constructor with that syntax
您可以提供一个 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)
除了 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"}}}};