And*_*eas 95 c++ arrays conventions
由于std::list
和std::vector
存在,是有什么原因在C++中使用传统的C数组,还是应该尽量避免,只是喜欢malloc
?
das*_*ght 109
在std::array
可用的C++ 11中,答案是"是的,应该避免使用数组".在C++ 11之前,您可能需要使用C数组在自动存储(即堆栈)中分配数组.
Jam*_*nze 85
当然,尽管std::array
在C++ 11中,实际上只用于静态数据.C样式数组有三个重要优势
std::vector
:
它们不需要动态分配.因此,在您可能拥有大量非常小的数组的情况下,首选C样式数组.说出类似n维点的东西:
template <typename T, int dims>
class Point
{
T myData[dims];
// ...
};
Run Code Online (Sandbox Code Playgroud)
通常,人们可能会想到一个dims
非常小(2或3),
T
一个内置类型(double
),并且最终可能会有
std::vector<Point>
数百万个元素.你绝对不希望数百万的动态分配3倍.
支持静态初始化.这只是静态数据的问题,其中包括:
struct Data { int i; char const* s; };
Data const ourData[] =
{
{ 1, "one" },
{ 2, "two" },
// ...
};
Run Code Online (Sandbox Code Playgroud)
这通常比使用向量(和std::string
)更好,因为它避免了所有初始化问题的顺序; 在执行任何实际代码之前,数据已预先加载.
最后,与上述相关,编译器可以从初始化器计算数组的实际大小.你不需要数数.
如果您可以访问C++ 11,那么std::array
解决前两个问题,并且在第一种情况下绝对应该优先使用C样式数组.然而,它没有解决第三个问题,并且根据初始化器的数量使数组具有编译器维度仍然是优选C样式数组的正当理由.
duf*_*ymo 15
永远不要说"从不",但我同意他们的角色会因STL的真实数据结构而大大减少.
我还说在对象内部封装可以最大限度地减少这种选择的影响.如果数组是私有数据成员,则可以在不影响类的客户端的情况下交换它.
Ed *_*eal 11
我曾致力于安全关键系统,您无法使用动态内存分配.内存必须始终在堆栈中.因此,在这种情况下,您将使用数组,因为大小在编译时是固定的.
array
in c++
为您提供固定大小的快速替代动态大小std::vector
和std::list
.std :: array是其中一个补充c++11
.它提供了std容器的好处,同时仍然提供了C样式数组的聚合类型语义.
因此,c++11
我肯定会std::array
在需要的地方使用矢量.但是我会避免使用C风格的数组C++03
.