声明结构时的向量分配
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::vector
s。该脚本随后根据 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<>
。
struct foo
std::array<int, 42> bar;
;
或boost::array<>
,如果 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. 第三,我写信是为了澄清这种方法也适用于他的代码。我建议他使用构造函数,但他的情况允许不要学习构造函数。以上是关于声明结构时的向量分配的主要内容,如果未能解决你的问题,请参考以下文章