2

我想知道,我通常在代码中使用 std::string ,但是当您在参数中传递字符串以进行简单比较时,只使用文字会更好吗?

考虑这个函数:

bool Message::hasTag(string tag)
{
    for(Uint tagIndex = 0; tagIndex < m_tags.size();tagIndex++)
    {
        if(m_tags[tagIndex] == tag)
            return 0;
    }

    return 1;
}

尽管它与之进行比较的属性是一个向量,并且无论使用此函数什么都可能将字符串传递给它,但使用 const char* 来避免创建一个新字符串会更好吗?无论如何都是字符串文字?

4

3 回答 3

16

如果你想使用类,这里最好的方法是一个 const 参考:

bool Message::hasTag(const string& tag);

这样,可以最大限度地减少冗余复制,并且清楚地表明该方法不打算修改参数。我认为一个聪明的编译器可以为使用字符串文字调用的情况发出非常好的代码。

传递一个字符指针需要你使用strcmp()to 比较,因为如果你直接使用 开始比较指针==,就会有……麻烦。

于 2010-07-05T16:14:45.670 回答
2

简短的回答:这取决于。

长答案:std::string非常有用,因为它为字符串提供了许多实用功能(搜索子字符串、提取子字符串、连接字符串等)。它还为您管理内存,因此不会混淆字符串的所有权。

在你的情况下,你也不需要。您只需要知道是否有任何对象m_tags与给定的字符串匹配。因此,对于您的情况,使用 a 编写函数const char *s就足够了。

但是,作为脚注:在谈论return values时,您几乎总是希望std::string优先考虑。那是因为 C 字符串根本没有所有权语义,所以返回 a 的函数需要非常仔细地记录,解释谁拥有指向的内存(调用者或被调用者),以及如果被调用者得到它,如何释放它(,, , 别的东西)。(const) char *const char *delete[]deletefree

于 2010-07-05T16:26:26.543 回答
1

我认为传递引用而不是string. 我是说:

bool Message::hasTag(const string& tag)

那只会复制对原始string值的引用。无论如何,它必须在某个地方创建,但在函数之外。这个函数无论如何都不会复制它的参数。

因为m_tags无论如何都是字符串的向量(我想),所以const string&参数会更好。

于 2010-07-05T16:25:49.677 回答