1

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

4

2 回答 2

6

是的,因为std::array它只是一个包含底层 C 样式数组的友好模板。你可以把它想象成这样:

template <typename T, int size>
class Array {
...
   T vals[size];
}

将 T 更改为上面的字符串,您将很快意识到您可以对字符串数组的内容执行的任何操作都可以std::array对字符串执行。这包括调整大小、删除任何你能想象到的东西。

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

由于容器std::array需要处理多种类型,因此它们倾向于对T传入的类型做出相对较少的典型记录假设。诸如要求 T 可以复制构造、默认构造和分配之类的东西。然后它通常由实施者*T来确保这几个假设是有效的。

*有一个非常高级的主题,称为模板专业化,其中可以编写一个专门的数组版本,只是为了说“字符串”。除了vector<bool>这些在标准容器中非常罕见。

于 2013-01-25T02:11:57.290 回答
1

假设您的意思是调整字符串的大小,那么是的。

于 2013-01-25T02:08:40.707 回答