声明struct时的向量分配

时间:2013-01-18 10:16:34

标签: c++ vector struct

您可以在:

中创建一个包含数组的C ++结构
struct foo{
    int bar[42];
};

我想做的是:

struct foo{
    std::vector<int> bar(42);
};

当然这不会编译,但你得到了意图。我知道.reserve()之类的, 但是我希望在声明foo时已经分配了空间。

原因是我应该改变一个相当复杂的Perl脚本,该脚本在结构体内生成带有数组的C代码。这些数组应该由std::vector替换。该脚本随后根据XML文件初始化数组,我宁愿不在脚本中使用push_back,因为结构是深层嵌套的(数组结构和结构数组)。阵列的大小当然会有所不同。

感谢您的建议。

5 个答案:

答案 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)

使用构造函数,如其他答案中所建议的那样。但我必须解决你的问题:

  1. 空间将在定义之后“已经分配”(如果使用构造函数);
  2. 你永远不应该使用.reserve(),只能使用.resize()(才能理解差异);
  3. 您可以安全地声明声明后调用.resize(),几乎没有开销(而不是使用构造函数)。 但无论如何,要学习并使用构造函数。