C++:固定但运行时定义长度数组的向量

Posted

技术标签:

【中文标题】C++:固定但运行时定义长度数组的向量【英文标题】:C++: Vector of fixed but runtime defined length arrays 【发布时间】:2014-06-18 08:39:33 【问题描述】:

我知道我可以使用

std::vector<std::array<int, 20> > myVec;

作为可在一维中增长的矩阵的容器。但是std:array<> 的大小必须在编译时定义。有什么简单的方法可以对运行时定义的数组做同样的事情吗?

我需要它来处理几 GB 的数据,所以我担心向量向量会带来不必要的开销。

【问题讨论】:

std::vector<std::vector<int> > myVec; 适合你吗? 两个尺寸都是固定的吗?如果是这样,请使用 M*N 大小的向量(或将其包装在类似矩阵的类中。) 【参考方案1】:

我需要这个来处理几 GB 的数据,所以我很害怕 向量的向量会带来不必要的开销。

然后围绕一个允许二维索引的一维vector 编写一个包装类,并将一个固定维度作为构造函数参数。

这是最有效的方式,因为只有一层间接。

【讨论】:

【参考方案2】:

您应该考虑使用std::vector< std::vector<int> > 来保存您的数据。过早的优化不是好事。

如果速度太慢,您可以为vector 编写自己的内存分配器或使用第三方内存分配器。对于像您这样的特定目标(存储许多相同大小的对象),自定义内存分配器可能会更快。

Loopunroller 在std::vector<int> 周围使用包装器的想法也很好。

【讨论】:

我同意,如果您不希望向量容纳超过设定的大小,请使用 std::vector::resize 使用调整大小时要小心,因为当您请求的大小小于当前持有的向量时,它会删除元素 向量的向量仅在包装类内部才有意义,因为没有什么可以保证内部向量具有相同的长度。必须以某种方式强制执行该不变量。 @risingDarkness 非常正确,但在这种情况下,我假设 OP 知道他想要矢量有多大。

以上是关于C++:固定但运行时定义长度数组的向量的主要内容,如果未能解决你的问题,请参考以下文章

自己动手实现java数据结构 向量

从逆序 C++ 访问向量时出现运行时错误 [关闭]

是否可以在运行时定义要在 STXXL 中排序的类型的长度?

变长 std::array 像

为啥 C# 数组在 Android 上运行时通过 ref 从 C# 传递到 C++ 库后变为长度 1 但在 Windows 上正常工作?

C++ 固定数量的向量大小作为类成员