函数的std :: string vs string literal

时间:2010-07-05 16:13:16

标签: c++ string stdstring string-literals

我想知道,我通常使用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 *来避免创建一个新的字符串仍然会更好是否像字符串文字一样使用?

3 个答案:

答案 0 :(得分:16)

如果你想使用类,这里最好的方法是const引用:

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

这样,可以最小化还原剂复制,并且清楚地表明该方法不打算修改参数。我认为一个聪明的编译器可以为这个用字符串文字调用的情况发出相当不错的代码。

传递字符指针需要您使用strcmp()进行比较,因为如果您开始使用==直接比较指针,则会出现......麻烦。

答案 1 :(得分:2)

简短回答:这取决于。

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

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

但是,作为一个脚注:在谈论返回值时,您几乎总是希望std::string优先于(const) char *。这是因为C字符串根本没有所有权语义,所以返回const char *的函数需要非常仔细地记录,解释谁拥有指向内存(调用者或被调用者),并且如果被调用者得到它,如何要将其释放(delete[]deletefree,还有其他内容。

答案 2 :(得分:1)

我认为传递参考而不是string的值就足够了。我的意思是:

bool Message::hasTag(const string& tag)

这将只复制对原始string值的引用。无论如何必须在somwhere创建,但在函数之外。该函数不会复制其参数。

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