如何使用包含对 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];
}