是否保证(float [m * n])等于(std :: array <std :: array <float,m>,n&gt;)在C ++ 11中

时间:2017-11-20 02:52:52

标签: arrays c++11

当我使用this lib时,他们声明&amp;使用像这样的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>

编辑:如果答案无法保证确实如此,则最好指出一个错误的情况。

1 个答案:

答案 0 :(得分:1)

arrayvector的内容必须是连续的。但是,能够从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])失败。而且这不可能是先验的;它是一个实现细节,因编译器而异,从TT,从NN