1

您可以创建一个包含数组的 C++ 结构:

struct foo{
    int bar[42];
};

我想做的是:

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

当然这不会编译,但你明白了。我知道 .reserve() 等,但我希望在声明 .reserve() 时已经分配了空间foo

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

感谢您的建议。

4

5 回答 5

6

使用构造函数:

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

创建实例时将自动分配向量的内存。初始化列表在构造函数主体执行之前初始化成员。

于 2013-01-18T10:18:17.393 回答
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 不可用并且允许 boost。

于 2013-01-18T10:18:24.347 回答
2

现有的答案已经解释了如何做你想做的事,但我认为他们错过了解释原因的重要部分。您需要掌握的是,struct在 C++ 中,它只是一个近乎同义的同义词,class唯一的区别是结构默认具有公共成员,而类默认具有私有成员。class您可以将代码中的每个实例替换为

struct X
{
    private:
    ...
}

它的工作原理完全相同,反之亦然,替换structsclass. 这意味着就像您使用构造函数对类执行所需的操作一样,您将构造函数与结构一起使用:

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

顺便说一句,这个构造函数还需要std::vector几个参数,第二个参数是填充向量的值,因此你可以foo() : bar(42, -1) {}用 的值填充向量-1

于 2013-01-18T10:48:33.503 回答
0

您应该在结构的构造函数中(最好在其初始化列表中)设置向量的大小(即 callstd::vector的构造函数)。

像这样:

struct foo{
    foo() : bar(42) {}
    std::vector<int> bar;
};
于 2013-01-18T10:18:08.310 回答
0

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

  1. 空间将在定义“已经分配” (在使用构造函数的情况下);
  2. 你不应该使用 .reserve(),只能使用 .resize()(在你理解差异之前);
  3. 您可以在声明后安全地调用 .resize() 并且几乎没有开销(而不是使用构造函数)。但无论如何,学习和使用构造函数。
于 2013-01-18T10:27:34.340 回答