st样式数组的std :: array

时间:2014-06-15 03:24:22

标签: c++ arrays c++11

有人告诉我,在C ++中,应该始终使用std::array而不是c-style数组。

在查看问题后,我遇到人们说std :: array更好。

从这个意义上说,我使用了很多std::array,有时当我使用其他库时,我必须使用带有c风格数组的方法。

例如,我正在使用此功能

void Draw(float* arg);

是否可以传递std::array<float,4>作为参数?

如果我传入&amp; vec4 [0]作为参数,是否会有任何未定义的行为?

从这个意义上讲,多维数组是否相同?

将此数组声明为

std::array<std::array<float,4>,4>;

如果我传入&amp; mtx4 [0] [0]作为参数,是否还会有任何未定义的行为?

编辑:感谢您在多维数组的代码中指出我的错误。我编辑了它。

1 个答案:

答案 0 :(得分:0)

  

是否可以将std :: array作为参数传递?

是。正确的语法是:

Draw(my_array.data());
  

如果我传入&amp; vec4 [0]作为参数,是否会有任何未定义的行为?

没有。从语法上讲,它不太善于使你的意图清晰,但在语义上它是相同的。

  

从这个意义上讲,多维数组是否相同?

是的,如果你的意思是经典的C多维数组,它实际上只是与索引信息相关的平面数组。不,如果你的意思是C array-of-array。

float array2d[5][5]; // ok
float *array2d[5]; // not ok
std::array<std::array<float,5>,5> array2d; // not ok

第一个有连续存储。另外两个是指向数组的指针数组,必须以不同的方式处理。这里没有足够的推荐方法。


我找到了多维数组的另一个/新语法的引用here。它应该提供连续的存储。

std::array<float,5,5>; // should be ok

我真的不知道这种语法的状态是什么。也许其他人可以提供帮助。


在对此声明进行进一步调查之后:

std::array<std::array<float,5>,5> array2d;

此处的array2d存储全部内联,不涉及指针。在所有情况下,我能够调查存储看起来是连续的,因此内存布局与

相同
float array2d[5][5];

这不是标准的要求。符合条件的实现可以插入额外的信息或填充,使sizeof(array<T>)大于sizeof(T[])对于某些T。如果确实如此,则这两者的存储布局将不同。