声明结构时的向量分配

Posted

技术标签:

【中文标题】声明结构时的向量分配【英文标题】:Vector allocation when declaring struct 【发布时间】:2013-01-18 10:16:34 【问题描述】:

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

struct foo
    int bar[42];
;

我想做的是:

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

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

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

感谢您的建议。

【问题讨论】:

如果我理解您的问题,您想用 std::vector 替换数组,但仍希望进行静态内存分配(即在编译时分配资源)。据我所知,std::vector 动态分配资源,这意味着下面使用构造函数的答案将在运行时分配内存。 【参考方案1】:

使用构造函数:

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

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

【讨论】:

【参考方案2】:

添加构造函数并使用初始化列表:

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

如果您的编译器支持 C++11 功能,请改用std::array&lt;&gt;

struct foo 
    std::array<int, 42> bar;
;

boost::array&lt;&gt;,如果 C++11 不可用且允许提升。

【讨论】:

可能值得一提的是,C++11 还允许在声明点进行初始化。【参考方案3】:

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

替换代码中class 的每个实例
struct X

    private:
    ...

它的工作原理完全相同,反之亦然class替换structs。这意味着就像您使用构造函数对类执行所需的操作一样,您可以在结构中使用构造函数:

struct foo

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

这个constructor 用于std::vector,顺便说一句,还有几个参数,第二个参数是填充向量的值,所以你可以用foo() : bar(42, -1) 来填充你的向量-1

【讨论】:

【参考方案4】:

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

像这样:

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

【讨论】:

【参考方案5】:

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

    空间将“已经分配”定义之后(在使用构造函数的情况下); 永远不要使用 .reserve(),只能使用 .resize()(在了解差异之前); 您可以在声明后安全地调用 .resize() 并且几乎没有开销(而不是使用构造函数)。 但无论如何,学习和使用构造函数。

【讨论】:

1 是什么意思?声明不分配任何内存。另外,您的意思是“从不使用reserve()”?为什么不?还有,3)错了,应该优先使用初始化列表。 1) 他说“我希望在声明时已经分配了空间”,我只是固定的话; 2)他不知道构造函数,你认为他会正确使用 .reserve() 吗? 3)我知道并附加它以立即回答 您误解了“声明”的含义。一个类声明是struct foo。他所拥有的是一个定义。既不分配内存。我并不是说他知道储备的作用,但“永远不要使用储备”是个坏建议。一个好的建议是“了解储备的作用”。绝对不是“从不做”。 3) 同样,您误解了“声明”的含义。 永远不要使用reserve,这让我觉得这是个坏建议。 1.我没有说他写了有问题的声明。我说的是声明,是的,他没有写有问题但会用代码写的声明。他的话意味着在对象构造之前分配了一些内存,这没有意义,我修复了WORDS。 2. 从第二行读到行尾。用心。 3. 第三,我写信是为了澄清这种方法也适用于他的代码。我建议他使用构造函数,但他的情况允许不要学习构造函数。

以上是关于声明结构时的向量分配的主要内容,如果未能解决你的问题,请参考以下文章

如何简单地分配不同结构的向量?

不能将结构分配给向量的索引吗? [关闭]

存储结构向量

将内存分配给结构向量的指针时出现 SEG FAULT

为结构属性分配不正确的值类型时的笑脸!

c++ 内存分配向量的指针