如何在构造函数调用中使用初始化程序列表来配置`std :: vector <std :: vector <myclass >>`?

时间:2019-05-22 19:18:51

标签: c++ class c++11 stdvector stdinitializerlist

大约一个小时前,有人向我指出了一个称为“初始值设定项列表”的东西,因此我立即开始研究它,但是有一件我不明白的事情。

如果我有类似的东西:

class ExtClass {
    public:
        int ext;
        int pet;        
        ExtClass();
};

ExtClass::ExtClass() {
    this->ext = rand();
    this->pet = rand();
}

class MainClass {
    public:    
        std::vector<std::vector<ExtClass>> attribute;

        MainClass(std::vector<int>>);
};

MainClass::MainClass(std::vector<int> varName) : attribute(...) { }

问题是我希望这种情况发生:

attribute[0] has {1, 2, 3, 4} of type ExtClass
attribute[1] has {5, 6}       of type ExtClass
attribute[2] has {7, 8, 9}    of type ExtClass

以此类推。

我想打的是:

std::vector<int> a{4, 2, 3};
MainClass mainObject(a);

得到我写的例子:

attribute[0] reserves 4 places and creates 4 objects using ExtClass constructor
attribute[1] reserves 2 places and creates 2 objects using ExtClass constructor
attribute[2] reserves 3 places and creates 3 objects using ExtClass constructor

是否有任何简短的方法可以使用初始化列表进行操作?还是需要采取另一种方法(如果可以的话)?

1 个答案:

答案 0 :(得分:3)

您可以在std::vector<ExtClass>的constrotr中 std::vector::resize MainClass的每个矢量

查看sample code

MainClass(const std::vector<int>& vec)
    : attribute(vec.size())
{
    int row = 0;
    // each cols will be resized to as per
    for(const int colSize: vec) attribute[row++].resize(colSize);
}

或按照注释中建议的 @RSahu

MainClass(const std::vector<int>& vec)
{
    attribute.reserve(vec.size()); // reserve the memory for row = vec.size()
    for (const int colSize : vec)
        attribute.emplace_back(std::vector<ExtClass>(colSize));
}