如何在构造函数调用中使用初始化列表来配置 `std::vector<std::vector<MyClass>>`?
How to use initialiser list in constructor call to configure `std::vector<std::vector<MyClass>>`?
大约一个小时前,有人向我指出了一个叫做初始化列表的东西,所以我立即开始研究它,但有一件事我不明白。
如果我有类似的东西:
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
是否有任何简短的方法可以使用初始化列表来做到这一点,或者我是否需要采取另一种方法(如果是的话)?
您可以 std::vector::resize
MainClass
的每个 vector std::vector<ExtClass>
.
看到一个(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);
}
或评论中建议的 。
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));
}
大约一个小时前,有人向我指出了一个叫做初始化列表的东西,所以我立即开始研究它,但有一件事我不明白。
如果我有类似的东西:
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
是否有任何简短的方法可以使用初始化列表来做到这一点,或者我是否需要采取另一种方法(如果是的话)?
您可以 std::vector::resize
MainClass
的每个 vector std::vector<ExtClass>
.
看到一个(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);
}
或评论中建议的
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));
}