用std :: array替换固定大小的数组?

DaB*_*ain 22 c++ arrays stl c++11

使用遗留代码,我问自己应该用新的std :: array替换固定大小的C风格数组吗?E. g.

static const int TABLE_SIZE = 64;
double table[TABLE_SIZE];
Run Code Online (Sandbox Code Playgroud)

用...来代替

std::array<double, TABLE_SIZE> table;
Run Code Online (Sandbox Code Playgroud)

虽然我看到使用std :: vector作为可变大小数组的好处,但我没有看到它们具有固定大小.table.size()无论如何都是已知的,std::begin(), std::end()因为自由函数也可以用于具有C风格数组的STL算法.因此,除了更符合标准外,我还能错过更多的好处吗?替换所有事件是否值得工作还是被认为是最佳实践?

Mar*_* A. 11

AFAIK std::array只提供了一个更好的类似STL的接口来处理而不是正常的C阵列.在性能和功能方面,两种选择可以归结为几乎相同,但std::array可以用作标准容器.

另一个特性:它们可能被视为元组,因为它们提供类似组的访问功能.

最后但并非最不重要的是user2079303注意到:如果您的代码将由新手程序员使用,它可以在将其作为参数传递时阻止数组衰减过程.

如果您想知道是否应该用std :: arrays替换所有C风格的数组,如果您要利用一些新的可用功能和/或重写一些代码以利用它们,答案是肯定的.这些能力.如果你只是简单地用带有std :: arrays的C数组替换它(没有接触任何其他东西),那么它可能是不值得的.


Ali*_*Ali 6

还有一件事我还没有提到:std::array::at().堆栈损坏可能非常讨厌调试,并且由于堆栈损坏导致的错误可能会隐藏很长一段时间.:(该situtation已成为有些更好地与地址消毒剂.不过,我更喜欢边界检查过地址消毒剂.

在我看来,绑定检查元素访问本身就足以使用std::array而不是C样式数组.

  • 是的,`.at()`_kinda_对`map`等有意义,但对`std :: array`完全没有意义.像瘟疫一样避免.编译器提供了`std :: array`的调试版本,它们通过编译选项进行边界检查,而不是一旦你正确地编制索引并实现了多少个循环,就不需要你找到并替换上级`[]`的所有内容. .at()`正在浪费. (4认同)
  • 断言用于验证先决条件,而不是例外. (3认同)
  • 如果您需要绑定检查的元素访问,那么您的代码已经存在错误。 (2认同)

Zyx*_*000 5

另一个功能std::array是可以复制分配;

std::array<int, 3> a = {1, 2, 3};
std::array<int, 3> b = {4, 5, 6};

std::array<int, 3> c = a;         // copy-construction
a = b;                            // copy-assignment
Run Code Online (Sandbox Code Playgroud)