Как использовать список инициализаторов в вызове конструктора для настройки `std :: vector`? - PullRequest
1 голос
/ 22 мая 2019

Примерно час назад или около того мне было указано на что-то, называемое списком инициализаторов, поэтому я сразу же начал его исследовать, но есть одна вещь, которую я не могу понять.

Если у меня есть что-то вроде:

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 Ответ

3 голосов
/ 22 мая 2019

Вы можете std::vector::resize каждый вектор из std::vector<ExtClass> в constrotr MainClass.

См. ( пример кода )

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...