应阵列在C ++中使用?(Should arrays be used in C++?)

2019-06-24 16:48发布

由于std::liststd::vector存在,是有什么原因在C ++中使用传统的C数组,还是应该尽量避免,就像malloc

Answer 1:

在C ++ 11,其中std::array是可用的,答案是“是,数组,应避免”。 之前C ++ 11,则可能需要使用C数组中自动存储(即,在堆栈)分配阵列。



Answer 2:

当然,虽然用std::array在C ++ 11,实际上只为静态数据。 空调风格数组有超过三个重要优势std::vector

  • 他们并不需要动态分配。 出于这个原因,C风格的数组是首选,你很可能有很多非常小的阵列。 这样说的n维点:

     template <typename T, int dims> class Point { T myData[dims]; // ... }; 

    通常情况下,可以想象一个其dims将非常小(2或3), T内置型( double ),以及你可能最终与std::vector<Point>与数以百万计的元素。 你肯定不希望以百万计3双的动态分配。

  • 支持静态初始化。 这仅仅是静态的数据,其中类似的问题:

     struct Data { int i; char const* s; }; Data const ourData[] = { { 1, "one" }, { 2, "two" }, // ... }; 

    这通常是优选使用的载体(和std::string ),因为它避免了初始化问题的所有顺序; 该数据是预先加载的,可以执行任何实际代码之前。

  • 最后,涉及上述,编译器可以计算从初始化所述阵列的实际大小。 你不必指望他们。

如果你有机会到C ++ 11 std::array解决了前两个问题,并且一定要优先在第一种情况下可以使用到C风格的数组。 它不涉及第三,但是,并具有编译器尺寸根据初始化符的数量阵列仍是有效的理由,更喜欢空调风格阵列。



Answer 3:

永远不要说“从来没有”,但我认为,它们的作用在很大程度上受到真正的数据结构从STL减少。

我也想说内对象的封装应尽量减少这样的选择的影响。 如果数组是私有数据成员,你可以向内或向外互换而不影响你的类的客户。



Answer 4:

我曾在那里你不能使用动态内存分配,安全关键系统的工作。 内存有永远是在栈上。 因此,在这种情况下,大小是固定在编译的时候,你会使用数组。



Answer 5:

arrayc++给你动态大小的固定大小的快速替代std::vectorstd::list 。 的std ::阵列是在加法的一个c++11 。 它提供了性病容器的好处,同时还提供C风格数组的聚合类型的语义。

因此,在c++11我会肯定使用std::array ,在那里它是必需的,在载体中。 但我会避免在C风格的数组C++03



Answer 6:

最通常, ,我不认为有任何理由使用过,比如说,原材料阵列vectors如果代码是新的

你可能不得不求助于使用数组,如果你的库必须与期望数组和原始指针的代码兼容。



Answer 7:

我知道很多人都指出的std ::数组在栈上分配阵列,和std ::对于堆向量。 但无论似乎支持非本地对齐。 如果你做任何形式的您要使用SSE或VPX说明,(分别因此需要128或256字节对齐的)数字代码,C数组仍然似乎是你最好的选择。



Answer 8:

我想说阵列仍然是有用的,如果你存储数据的小静量何乐而不为。



Answer 9:

数组的唯一优势(当然裹着的东西,将自动管理其在需要时释放)以上std::vector我能想到的是, vector不能通过其数据的所有权,除非你的编译器支持C ++ 11和移动构造函数。



Answer 10:

空调风格数组是一个基本的数据结构,所以会有这样的情况,当它是更好地使用它。 对于一般的情况下,然而,使用四舍五入的基础数据的角部更先进的数据结构。 C ++允许你做一些与记忆非常有趣和有用的东西,其中有许多简单的数组。



Answer 11:

你应该在内部使用STL容器,但你不应该传递指针,以这样的容器不同模块之间,或者你会依赖地狱告终。 例:

std::string foo;
//  fill foo with stuff
myExternalOutputProc(foo.c_str());

是一个很好的解决方案,但不

std::string foo;
//  fill foo with stuff
myExternalOutputProc(&foo);

其原因是,的std :: string可以在许多不同的方式来实现,但是C风格的字符串总是一个C风格的字符串。



文章来源: Should arrays be used in C++?