当我使用this lib时,他们声明&使用像这样的Vector3数组(不完全像,但理想情况下)
#define DIMENSION 3
#define ARRAY_LEN 7
/*Declare*/
float Raw[DIMENSION*ARRAY_LEN] = { 0 };
/*Usage*/
for(int i=0;i<ARRAY_LEN;i+=3)
{
(&Raw[i])[0] = 1.0f;
(&Raw[i])[1] = 2.0f;
(&Raw[i])[2] = 3.0f;
}
我觉得这很难维持和扩展。
我听说std :: vector元素保证是连续的,所以我想使用std :: array
使它成为一个二维数组array<array<float,DIMENSION>,ARRAY_LEN> arr;
通过我的测试,我发现这可能是真的。即使我知道std :: vector不能,但我仍然测试std :: vector
float Raw[DIMENSION*ARRAY_LEN] = { 0 };
vector<vector<float>> vec;
vec.resize(ARRAY_LEN);
for (vector<float> &v : vec)
{
v.resize(DIMENSION);
}
array<array<float,DIMENSION>,ARRAY_LEN> arr;
int i;
i = 0;
for (int n = DIMENSION*ARRAY_LEN, i = 0; i < n; ++i)
{
Raw[i] = i;
}
i = 0;
for (vector<float> &item : vec)
{
for (float &f : item)
{
f = i++;
}
}
i = 0;
for (array<float, DIMENSION> &item : arr)
{
for (float &f : item)
{
f = i++;
}
}
float* testVec;
testVec = &vec[0][0];
float* testArr;
testArr = &arr[0][0];
for (int n = DIMENSION*ARRAY_LEN, i = 0; i < n; ++i)
{
if (testVec[i] != Raw[i])
{
printf("Test vec %d\n", i);
}
if (testArr[i] != Raw[i])
{
printf("Test arr %d\n", i);
}
}
所以我测试了它,但我仍然想知道它是否安全。我想确认它是否保证(float [m*n]
)等于(std::array<std::array<float,m>,n>
)
编辑:如果答案无法保证确实如此,则最好指出一个错误的情况。
答案 0 :(得分:1)
array
和vector
的内容必须是连续的。但是,能够从array
/ vector
元素的一个 sub 元素跳转到另一个array
的子元素} / vector
元素不保证。
也就是说,只需增加arr[0][3]
,就无法从arr[1][0]
跳到float*
。即使忽略指针算术的严格标准措辞,也允许array<T, N>
具有填充,因此sizeof(array<T, N>)
不需要sizeof(T[N])
。多维vector
甚至更成问题,因为每个元素vector
都有自己的分配,这肯定不会与其他分配连续。
如果答案无法保证这是真的,那么我们更倾向于指出这是错误的情况。
总是错误。 vector
的多个vector<vector<T>>
元素将具有不同的分配。周期。
至于array
,C ++不允许跨数组的指针算法,只允许在数组中。如果你想忽略它(你既不会是第一个也不是最后一个),它仍然会在任何时候sizeof(array<T, N>) != sizeof(T[N])
失败。而且这不可能是先验的;它是一个实现细节,因编译器而异,从T
到T
,从N
到N
。