【问题标题】:std::array over c style arrayc 样式数组上的 std::array
【发布时间】:2014-06-15 03:24:21
【问题描述】:

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

查看问题后,我发现有人说 std::array 更好。

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

例如,我正在使用这个函数

void Draw(float* arg);

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

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

从这个意义上说,多维数组也会一样吗?

将此数组声明为

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

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

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

【问题讨论】:

  • std::array 只是有一个数组作为其成员。该数组的行为与任何其他数组一样。但是,请考虑改用.data()。而且您的“多维数组”示例甚至不适用于普通数组。不要指望 2D std::array 有任何魔力。
  • “是否可以将std::array&lt;float,4&gt; 作为参数传入?” 可以! Draw( my_cpp_array.data() );。你问了很多问题,所以我已经筋疲力尽了。 :)
  • std::array 的一个好处是,如果您使用at() 方法访问数据,它会进行边界检查,从而使您免于著名的of-by-one 的麻烦。错误,并不总是很容易在原始数组上检测到。 en.wikipedia.org/wiki/Off-by-one_error
  • 关于你的最后一个问题:绝对不是。你知道float[4][4] 与float** 不兼容,对吗?
  • 感谢所有及时回复。我编辑了这个问题,因为我之前误解了“多维”数组。我不知道 .data() 方法。抱歉问了太多问题。我认为考虑到同样的事情会没问题。 =D

标签: c++ arrays c++11


【解决方案1】:

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

是的。正确的语法是:

Draw(my_array.data());

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

没有。从句法上讲,它不太擅长表达你的意图,但在语义上是一样的。

从这个意义上说,多维数组也会一样吗?

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

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&lt;T&gt;) 大于sizeof(T[]) 对于某些 T。如果这样做,那么这两个的存储布局将不同。

【讨论】:

  • @DrewDormann:谢谢,公平的评论。我尝试对 OP 给出一个好的答案,而且大多数情况下我都做对了,但有时评论者会发现错误,我必须编辑我的答案。 SO 的重点是最终答案质量很高,因为有很多人检查它们。
  • 我不确定你最后一点是什么意思,但std::array 的std::array 具有连续存储。它就像一个经典的 C 多维数组。
  • @david.pfx:你真的需要纠正你的最后一点。 std::array 或 std::arrray 不涉及“指向数组的数组”。
  • @david.pfx: §23.3.2.1 [array.overview], “数组的元素是连续存储的,这意味着如果 a 是一个数组 那么它服从恒等式&a[n] == &a[0] + n 对于所有 0 std::array 中的std::array 是连续数组的连续数组。
  • 我看不出如何在满足std::array 的所有要求的同时实现它。另一方面,您实际上是在做出未经证实的断言。
猜你喜欢
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2018-11-02
  • 2017-09-24
  • 1970-01-01
相关资源
最近更新 更多