【问题标题】:C++ 3D vector preserving "blocks"C++ 3D 向量保留“块”
【发布时间】:2012-05-07 23:13:45
【问题描述】:

假设我需要数量不定的 3×4 矩阵。 (或任何其他固定 m×n 维矩阵的序列。)我的第一个想法是将这些矩阵存储在 std::vector 中,其中每个矩阵本身就是 std::vector<std::vector<double> >。如何使用std::vector::reserve() 为这些矩阵中的一个数字(例如x)预分配空间?因为我知道两个维度,我应该(或者我希望)能够x 乘以这些块的大小。

我知道如何在 1D std::vector 中实现此对象,但我想知道如何在 3D 中实现此对象 std::vector,如果没有其他原因,只是为了更好地学习如何使用 @987654328 @类。

【问题讨论】:

  • 没有preserve这样的东西。
  • 你的意思是reserve()preserve 并不像 Kerrek SB 所说的那样存在
  • 对不起,是的,我的意思是“保留”而不是“保留”。 :)

标签: c++ vector multidimensional-array stdvector preserve


【解决方案1】:

将矩阵存储为向量中的向量可能效率很低,但如果必须,就去做吧。预留空间和往常一样:

typedef std::vector<std::vector<int>> matrix_type;

std::vector<matrix_type> collection;

collection.reserve(100);  // set capacity for 100 "matrices"

// make 10 4x3-matrices; `collection` won't reallocate
collection.resize(10, matrix_type(4, std::vector<int>(3)));

对于您的基本类型,您最好拥有一个由 m * n 元素组成的向量并大步访问它,即 (i,j)th 元素将位于 @987654323 位置@。每个向量本身都是一个动态容器,您可能不希望到处都有那么多动态分配。

同样,上面的 reserve 调用可能不会像你想的那样,因为它只为内部向量的簿记数据保留内存(通常每个向量三个字,即 300 个字),并且 不是实际数据。

有鉴于此,您甚至可以考虑将std::array&lt;int, m*n&gt; 作为您的矩阵类型(并大步访问它);现在您可以实际为实际矩阵预先预留空间 - 但 mn 现在必须是编译时常量。

【讨论】:

  • 非常感谢。这很有帮助。我非常喜欢使用std::array 作为矩阵类型的想法。
【解决方案2】:

更好的方法是提供一个类接口并为整个矩阵使用单个线性内存块。然后,您可以通过不同的方式实现该接口,范围从适当大小的内部数组(如果大小是大小的一部分),或通过提供索引 (pos = row*cols + col) 的单个 std::vector&lt;int&gt;

std::vector&lt; std::vector&lt;int&gt; &gt; 方法中,外部向量将分配内存来存储内部向量,每个向量都会分配内存来保存自己的元素。使用原始指针,它在内存布局上类似于:

int **array = new int*[ N ];
for ( int i = 0; i < N; ++i ) 
   array[i] = new int[ M ];

即:

[ 0 ] -------> [ 0, 1, 2, ... ]
[---]
[ 1 ] -------> [ 0, 1, 2, ... ]
[ . ]
[ . ]

或者基本上是 N+1 个单独的内存块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    相关资源
    最近更新 更多