2

在我的课堂上,我需要存储一const static组字符串。由于现在用 C++ 编写的代码(部分)基于原始 C 算法,因此数据存储为const char* presets[150](有 150 个字符串)。因为我现在基本上是在 C++ 中重写/重新打包它,所以char*变成string. 我的问题是:我应该将数组更改为vector吗?

在这种情况下什么更好,const static vector<string> presets或者const static string presets[150]

4

3 回答 3

3

当然不是后者。

如果大小不需要更改,请使用

std::array<std::string, 150>

这样,您将能够以与std::vector.

编辑:关于string初始化可能出现的问题:您可以将数组创建为 C 样式数组,然后将数据复制到array. 由于您将复制(大约)600 字节的连续块,因此这不是非常昂贵的操作。

于 2013-01-07T15:41:51.983 回答
2

实际上是char const* const presets[] = { ... };用字符串文字初始化的吗?换句话说,当您说 时 char const* presents[150],这是因为有人忘记了第二个const,还是因为您稍后实际上修改了指针。是因为有人实际计算了初始化程序,并将数字放在大括号中,并且每次添加或删除初始化程序时都会更新此数字,还是因为您提供的初始化程序较少,并且依赖于正在初始化的尾随值一个空指针?在不确切知道您要做什么的情况下,很难给出好的建议。

在我遇到的最常见的情况下,您真正​​想要的是一切都是 const,并且数组的大小与初始化器的数量完全对应,最好的解决方案可能是保持原样。要自动调整数组大小,您需要使用 C 样式数组,或(然后仅使用 C++11)std::vectorstd::array要求您明确给出元素的数量。并且要获得真正的静态初始化(因此 永远不会有任何初始化顺序问题的风险),您需要一个 C 样式数组或std::array,在两种情况下 char const*(而不是std::string,这需要动态初始化)。

请注意,使用char const*而不是std::string确实意味着每次访问它时(通常),您将构造一个新的std::string. 根据实现,这可能会引入一些额外的运行时开销。通常,这不是问题,但也可能需要考虑;必须权衡一个事实,即如果您使用来自其他静态对象的构造函数的对象,则使用std::string 将导致必须解决的初始化顺序问题。

于 2013-01-07T16:13:47.997 回答
1

这取决于。如果您使用 std::string 的数组或向量,则必须在运行时处理对象的初始化。如果您使用原始数组,则所有内容都会在编译时初始化。另一方面,当您需要诸如恒定时间 size() 之类的附加功能时,使用“真实”对象可能会很有用。

于 2013-01-07T16:20:03.770 回答