由于std::list
和std::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:
array
在c++
给你动态大小的固定大小的快速替代std::vector
和std::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风格的字符串。