将字符串文字传递给std :: map :: find(..)

时间:2010-03-17 16:07:36

标签: c++ string

我有一个std :: map:

std::map<std::string, std::string>

我正在传递字符串文字来查找方法。显然,我可以传递一个字符串文字,如

.find("blah");

但是,我想提前声明它,而不是硬编码字符串,所以我现在有几个选择:

const std::string mystring = "blah";
const char mystring[] = "blah";
static const char * mystring = "blah";

他们都工作。 (或至少编译)。我的问题是,我应该使用哪一个?另一方的优势/劣势是什么?

4 个答案:

答案 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";