拥有动态对象的std ::数组是否安全?

Vin*_*ent 1 c++ arrays memory-management stl c++11

std::array例如std::array<std::string, 3>,拥有一个动态对象并调整内容(字符串)的大小是否安全?(因为有一个原始的C字符串数组可能会有问题)

Dou*_* T. 6

是的,因为std::array它只是一个友好的模板,它包含了一个底层的C风格的aray数组.您可以将其视为以下内容:

template <typename T, int size>
class Array {
...
   T vals[size];
}
Run Code Online (Sandbox Code Playgroud)

将T更改为上面的字符串,您将很快意识到您可以对字符串数组的内容执行任何操作,您可以使用std::array字符串.这包括调整大小,删除,无论你能想象到什么.

要更深入地思考它,请以这种方式思考.将std::array持有的字符串.字符串不知道它被保持在哪里.当数组本身被分配时,数组可能会告诉字符串自己复制(通过复制构造函数或赋值).但是,这完全是通过字符串的公共接口完成的.字符串由任何数据结构保存的事实并不限制该字符串的功能,它只是使持有者(在这种情况下std::array)成为string公共接口的另一个客户端.

由于容器std::array需要使用各种类型,因此它们倾向于对T传入的类型进行相对较少的通常记录良好的假设.例如要求T可以复制构造,默认构造和分配.然后通常由实施者*T来确保这些假设是有效的.

*有一个非常高级的主题叫做模板专业化,人们可以只为"string"编写一个专门版本的数组.除了vector<bool>这些与标准容器相当罕见.