我有一张表示DB对象的地图。我想从它std :: string常量的正确用法?
std::map<std::string, std::string> dbo;
...
std::string val = map["foo"];
所有得很好“众所周知”的值,但是这让我感到“foo”被转换为在每次调用一个临时字符串。当然,最好是有一个恒定的std :: string(当然,它可能是一个很小的开销,与刚刚提取对象的磁盘IO相比,但它仍然是一个我认为有效的问题)。那么std :: string常量的正确用法是什么?
例如 - 我能有
const std::string FOO = "foo";
在HDR
,但后来我得到多份
编辑:没有答案了说如何声明的std :: string常量。忽略整个地图,STL等问题。很多代码是std :: string(很明显是),很自然地想要为它们定义常量而不需要一遍又一遍地分配内存分配
EDIT2:拿出Manuel的PDF回答的第二个问题,不良习语的附加例子
编辑3:答案总结。请注意,我没有包括那些建议创建一个新的字符串类。我很失望,因为我希望有一个简单的东西,只能在头文件中工作(如const char * const)。反正
一)从弗拉德
// str.h
extern const std::string FOO;
// str.cpp
const std::string FOO = "foo";
C)标记B
std::map<int, std::string> dict;
const int FOO_IDX = 1;
....
dict[FOO_IDX] = "foo";
....
std:string &val = dbo[dict[FOO_IDX]];
b)由罗杰·P
// really you cant do it
(二)似乎是最接近我想要的东西但有一个致命的缺陷。我无法使用这些字符串的静态模块级代码,因为它们可能尚未构建。我想过(a),实际上在序列化对象时使用类似的技巧,发送索引而不是字符串,但它似乎是一个通用解决方案的很多管道。所以,可悲的是(C)获胜,有性病不简单 const的成语:字符串
重新编辑,我试图解决这个问题(“不,这不是如何标准::字符串工作”和“这里是另一个字符串类”),但请注意,如果你只是想存储const std ::字符串的地方作为全局变量,你只需要用ref-counting实现(gcc提供的和标准明确允许的)来支付一次(在程序启动时)的分配。只要确保这些全局变量是* const *即可轻松避免各种逻辑错误。 – 2010-02-22 18:41:23
所以你的答案是 - 它不可能。它不明确。如果没有人提出更好的答案,那么你会得到刻度标记 – pm100 2010-02-22 18:43:16
其实我现在喜欢Manuel的答案。抱歉,我不够清楚,这就是为什么我发表评论,但我也偷偷在另一个选项意外。 :) – 2010-02-22 18:54:45