我有一个std :: map:
std::map<std::string, std::string>
我正在传递字符串文字来查找方法。显然,我可以传递一个字符串文字,如
.find("blah");
但是,我想提前声明它,而不是硬编码字符串,所以我现在有几个选择:
const std::string mystring = "blah";
const char mystring[] = "blah";
static const char * mystring = "blah";
他们都工作。 (或至少编译)。我的问题是,我应该使用哪一个?另一方的优势/劣势是什么?
答案 0 :(得分:6)
假设你的地图是由std::string
键入的(我认为它必须是所有三个编译选项),那么第一个更有效率。您将创建一个字符串对象,并通过引用将其传递给find
的每个调用。其他的将导致为每个find
创建一个临时字符串对象。
答案 1 :(得分:2)
(假设key_type
的{{1}}为map
)
我会选择你没有指定的选项:
std::string
这样,字符串既是只读的,只是初始化一次。
答案 2 :(得分:2)
优点和劣势:
const std::string mystring = "blah";
这几乎是处理字符串的标准C ++方法。你可以做任何你需要做的事情。主要缺点是速度较慢。那里有动态分配。此外,如果.find
在幕后依赖char[]
,那么你就是在浪费所有堆工作,甚至可能需要做更多工作才能在内部获得c可用数组。
const char mystring[] = "blah";
这会在堆栈上分配5字节的字符串,所以它很好而且速度很快。缺点是,如果.find
使用std :: string,那么无论如何它都必须进行分配,并且它将在每次调用时执行,而不是仅执行一次。此外,如果你不得不用它做任何其他事情(例如:catenate“.txt”),那么使用std :: string会更容易。
static const char * mystring = "blah";
如果这是在外部范围内,这意味着它保持在源文件的本地。 C ++的方法是使用未命名的命名空间而不是static
。这样做的唯一好处是它与C兼容(或者至少与新的编译器兼容,知道“const”是什么)。
一般来说,我会选择std :: string。除特殊情况或极端情况外,易用性优于速度。
答案 3 :(得分:0)
我更喜欢
const char * const mystring = "blah";