您可以在:
中创建一个包含数组的C ++结构struct foo{
int bar[42];
};
我想做的是:
struct foo{
std::vector<int> bar(42);
};
当然这不会编译,但你得到了意图。我知道.reserve()之类的,
但是我希望在声明foo
时已经分配了空间。
原因是我应该改变一个相当复杂的Perl脚本,该脚本在结构体内生成带有数组的C代码。这些数组应该由std::vector
替换。该脚本随后根据XML文件初始化数组,我宁愿不在脚本中使用push_back
,因为结构是深层嵌套的(数组结构和结构数组)。阵列的大小当然会有所不同。
感谢您的建议。
答案 0 :(得分:5)
使用构造函数:
struct foo{
std::vector<int> bar;
foo() : bar(32) {}
};
创建实例时,将自动分配向量的内存。初始化列表在构造函数体执行之前初始化成员。
答案 1 :(得分:3)
添加构造函数并使用初始化列表:
struct foo {
foo() : bar(42) {}
std::vector<int> bar;
};
如果您的编译器支持C ++ 11功能,请改用std::array<>
。
struct foo {
std::array<int, 42> bar;
};
或boost::array<>
如果C ++ 11不可用且允许加速。
答案 2 :(得分:2)
现有的答案已经解释了如何做你想做的事情,但我认为他们错过了解释原因的重要部分。你需要掌握的是,struct
在C ++中只是class
的近似同义词,只有 的区别在于结构默认为拥有公共成员和class默认为private。您可以使用
class
的每个实例
struct X
{
private:
...
}
,它将完全相同,反之亦然,用structs
替换class
。这意味着正如您将使用构造函数对类执行所需操作一样,您可以在结构中使用构造函数:
struct foo
{
std::vector<int> bar;
foo() : bar(42) {}
}
这个std::vector
foo() : bar(42, -1) {}
,顺便说一下,还需要更多参数,第二个是填充矢量的值,这样你就可以-1
用值填充矢量{{1}}。
答案 3 :(得分:0)
您应该在结构的构造函数中设置向量的大小(即call std::vector
的构造函数)(最好在其初始化列表中)。
像这样:
struct foo{
foo() : bar(42) {}
std::vector<int> bar;
};
答案 4 :(得分:0)
使用构造函数,如其他答案中所建议的那样。但我必须解决你的问题: