在我的课堂上,我需要存储一组const static
字符串。由于现在用C ++编写的代码基于原始C算法(部分),因此数据存储为const char* presets[150]
(有150个字符串)。由于我现在基本上用C ++重写/重新打包,char*
变为string
。我的问题是:我应该将数组更改为vector
吗?
在这种情况下,const static vector<string> presets
或const static string presets[150]
还有什么更好?
答案 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的数组或向量,则必须在运行时处理对象的初始化。如果使用原始数组,则在编译时初始化所有内容。另一方面,当您需要额外的功能(如恒定时间大小())时,使用“真实”对象可能会很有用。