std :: vector和多维数组的连续内存

use*_*267 5 c++ standards memory-management vector contiguous

我知道标准不强制std::vector分配连续的内存块,但所有实现都遵循这一点.

假设我希望创建一个多维静态数组的向量.为简单起见考虑2个维度,并考虑长度为N的向量.也就是说,我希望创建一个具有N个元素的向量int[5].

我可以确定所有N*5整数现在在内存中是连续的吗?所以我原则上可以通过知道第一个元素的地址来访问所有整数?这个实现依赖吗?

作为参考,我当前在连续内存块中创建2D数组的方法是首先创建一个长度为N的浮动*(动态)数组,在一个数组中分配所有N*5个浮点数,然后将每个第5个元素的地址复制到第一个数组float*.

Jam*_*nze 13

该标准确实要求a的记忆std::vector是连续的.另一方面,如果你写的东西如下:

std::vector<std::vector<double> > v;
Run Code Online (Sandbox Code Playgroud)

全局内存(所有v[i][j])不会是连续的.创建2D数组的常用方法是使用单个数组

std::vector<double> v;
Run Code Online (Sandbox Code Playgroud)

并完全按照您的建议计算索引float.(如果需要,您也可以std::vector<float*>使用地址创建第二个.但是,我总是只重新计算索引.)

  • +1,对于初始方法,您可以考虑 C++FAQ lite 中的这个[示例](http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10)。 (2认同)

Alo*_*ave 5

根据C++标准,Vector的元素被保证为连续的.
标准引用如下:

从n2798(C++ 0x草案):

23.2.6类模板向量[向量]

1 vector是一个支持随机访问迭代器的序列容器.此外,它支持(摊销)最后的恒定时间插入和擦除操作; 在中间插入和擦除需要线性时间.存储管理是自动处理的,但可以提供提示以提高效率.向量的元素是连续存储的,这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0 <= n <v的身份&v [n] ==&v [0] + n .尺寸()​​.

C++ 03标准(23.2.4.1):

向量的元素是连续存储的,这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0 <= n <v的身份&v [n] ==&v [0] + n .尺寸()​​.

此外,看到这里有什么香草萨特对了同样的观点.


Jer*_*fin 5

正如@Als 已经指出的那样,是的,std::vector(现在)保证连续分配。我,但是,模拟2D矩阵具有指针的阵列。相反,我会推荐两种方法之一。更简单的(到目前为止)只是operator()用于下标,并进行乘法以将 2D 输入转换为向量中的线性地址:

template <class T>
class matrix2D { 
     std::vector<T> data;
     int columns;
public:
     T &operator()(int x, int y) {
         return data[y * columns + x];
     }

     matrix2D(int x, int y) : data(x*y), columns(x) {}
};
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因,您想使用matrix[a][b]样式寻址,则可以使用代理类来处理转换。虽然它用于 3D 矩阵而不是 2D,但我在之前的答案中发布了此技术的演示。


fre*_*low 3

作为参考,我目前在连续内存块中创建 2D 数组的方式是首先创建一个长度为 N 的 float* 的(动态)数组,在一个数组中分配所有 N*5 个浮点,然后将每 5 个元素的地址复制到第一个 float* 数组。

这不是一个二维数组,而是一个指针数组。如果你想要一个真正的二维数组,可以这样做:

float (*p)[5] = new float[N][5];

p [0] [0] = 42;   // access first element
p[N-1][4] = 42;   // access last element

delete[] p;
Run Code Online (Sandbox Code Playgroud)

请注意,只有一个分配。我可以建议您阅读有关在 C++ 中使用数组的更多信息吗?

  • `std::vector&lt;std::array&lt;float, 5&gt; &gt;` (4认同)