如何使用包含对 mapped_type 的构造函数调用的初始化列表最简洁地初始化 std::map
How to most concisely initialize std::map using an initializer list that includes a constructor call for the mapped_type
向量构造函数在下面的语句中调用构造向量,每个向量中有 50 个具有相同值的元素作为 sviMap 中的值。该语句重复 vector<int>
三次。有没有更简洁的方法来实现 sviMap 的整体初始化,其中 vector<int>
在语句中只出现一次?
map<string, vector<int>> sviMap { {"Leo", vector<int>(50, 101)} , {"Brad", vector<int>(50, 201)} };
严格来说,没有。您需要具有模板专业化和向量的两个实例。
但如果您需要“此文本一次”,此解决方法可能适合您:
using vi = vector<int>;
map<string, vi> sviMap{ {"Leo", vi(50, 101)} , {"Brad", vi(50, 201)} };
形式上,这不是“语句”,而是两个语句,但向量只出现一次。如果您的目标是获得一分进行更改,这可能会奏效。
你可以这样做,只需要使用嵌套的初始化器
#include <map>
#include <vector>
#include <string>
int main()
{
std::map<std::string, std::vector<int>> sviMap
{
{"Leo", {50, 101}},
{"Brad", {50, 201}}
};
auto vec = sviMap["Leo"];
}
我想纠正我的错误,所以这里有另一个解决方案。
而这将产生正确长度的向量。
我只是使用继承来创建一个带有构造函数的向量类型,该构造函数具有所需的行为,因此您可以使用没有额外细节的初始化列表
#include <cassert>
#include <map>
#include <vector>
#include <string>
template<typename type_t>
class my_vector :
public std::vector<type_t>
{
public:
my_vector() = default;
my_vector(const size_t size, const type_t value) :
std::vector<type_t>(size, value)
{
}
};
int main()
{
std::map<std::string, my_vector<int>> sviMap{ { "Leo", {50, 101}}, { "Brad", {50, 201}} };
auto vec = sviMap["Leo"];
auto value = vec[23];
}
向量构造函数在下面的语句中调用构造向量,每个向量中有 50 个具有相同值的元素作为 sviMap 中的值。该语句重复 vector<int>
三次。有没有更简洁的方法来实现 sviMap 的整体初始化,其中 vector<int>
在语句中只出现一次?
map<string, vector<int>> sviMap { {"Leo", vector<int>(50, 101)} , {"Brad", vector<int>(50, 201)} };
严格来说,没有。您需要具有模板专业化和向量的两个实例。
但如果您需要“此文本一次”,此解决方法可能适合您:
using vi = vector<int>;
map<string, vi> sviMap{ {"Leo", vi(50, 101)} , {"Brad", vi(50, 201)} };
形式上,这不是“语句”,而是两个语句,但向量只出现一次。如果您的目标是获得一分进行更改,这可能会奏效。
你可以这样做,只需要使用嵌套的初始化器
#include <map>
#include <vector>
#include <string>
int main()
{
std::map<std::string, std::vector<int>> sviMap
{
{"Leo", {50, 101}},
{"Brad", {50, 201}}
};
auto vec = sviMap["Leo"];
}
我想纠正我的错误,所以这里有另一个解决方案。 而这将产生正确长度的向量。 我只是使用继承来创建一个带有构造函数的向量类型,该构造函数具有所需的行为,因此您可以使用没有额外细节的初始化列表
#include <cassert>
#include <map>
#include <vector>
#include <string>
template<typename type_t>
class my_vector :
public std::vector<type_t>
{
public:
my_vector() = default;
my_vector(const size_t size, const type_t value) :
std::vector<type_t>(size, value)
{
}
};
int main()
{
std::map<std::string, my_vector<int>> sviMap{ { "Leo", {50, 101}}, { "Brad", {50, 201}} };
auto vec = sviMap["Leo"];
auto value = vec[23];
}