const vector <string>或const string []?</string>

时间:2013-01-07 15:39:47

标签: c++ arrays vector

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

在这种情况下,const static vector<string> presetsconst static string presets[150]还有什么更好?

3 个答案:

答案 0 :(得分:3)

当然不是后者。

如果尺寸不需要更改,请使用

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

通过这种方式,您将能够以与std::vector非常相似的方式对其进行操作。

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

答案 1 :(得分:2)

实际上是char const* const presets[] = { ... };, 用字符串文字初始化?换句话说,当你说 char const* presents[150],这是因为有人忘记了 第二个const,或者是因为你实际修改了 指针稍后。是因为有人真的算了 初始化程序,并将数字放在大括号中,然后更新 每次添加或删除初始化程序时,此编号,或者是它 因为你提供的初始化程序较少,并且依赖于尾随 使用nul指针初始化值?不知道 正是你想要做的事情,很难给予好处 建议。

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

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

答案 2 :(得分:1)

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