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++:固定但运行时定义长度数组的向量的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C# 数组在 Android 上运行时通过 ref 从 C# 传递到 C++ 库后变为长度 1 但在 Windows 上正常工作?