Answers:
在std::array
可用的C ++ 11中,答案是“是的,应避免使用数组”。在C ++ 11之前,您可能需要使用C数组在自动存储中(即在堆栈上)分配数组。
当然,尽管std::array
在C ++ 11中使用,但实际上仅用于静态数据。C样式数组具有以下三个重要优点
std::vector
:
他们不需要动态分配。因此,如果您可能有很多非常小的数组,则首选C样式数组。说出类似n维点的内容:
template <typename T, int dims>
class Point
{
T myData[dims];
// ...
};
通常,您可能会想到a 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样式数组。但是,它没有解决第三个问题,并且让编译器根据初始化程序的数量来确定数组的尺寸仍然是首选C样式数组的有效理由。
int i[] = { 1, 2, 3 };
继续与int i[] = { 1, 2, 3, 4 };
。array<int, 3>
需要手动更改为array<int, 4>
。
std::array
在C ++ 11中,[它们应该]实际上仅用于静态数据”。
我曾在无法使用动态内存分配的安全关键系统上工作。内存必须始终在堆栈上。因此,在这种情况下,您将使用数组,因为大小在编译时是固定的。
std::array<T>
在堆栈上分配,并且在原始数组上基本上没有开销。
array
可以c++
为您提供固定尺寸的动态尺寸std::vector
和动态尺寸的快速替代方案std::list
。std :: array是中的新增功能之一c++11
。它提供了std容器的优点,同时仍然提供了C样式数组的聚合类型语义。
因此,在向量中c++11
我肯定会使用std::array
,在需要的地方。但是我会避免使用C样式数组C++03
。
通常,不,我想不出使用原始数组的理由,例如vectors
。如果代码是新的。
如果您的库需要与需要数组和原始指针的代码兼容,则可能不得不使用数组。
vector.data()
在C ++ 11或更低版本中&vector.front()
。
我要说的是数组仍然有用,如果您要存储少量静态数据,为什么不这样做。
std::vector
我可以想到的一个数组(当然是包裹在可以在需要时自动处理其释放的东西)中的唯一优点是,vector
它不能传递其数据的所有权,除非您的编译器支持C ++ 11并移动构造函数。
swap
。
您应在内部使用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样式字符串。