C ++:string.empty()总是等于string ==“”?

时间:2009-01-27 13:10:26

标签: c++ string

我可以假设给定

std::string str;
... // do something to str

以下陈述是否始终为真?

(str.empty() == (str == ""))

7 个答案:

答案 0 :(得分:52)

答案

是。以下是bits/basic_string.h的相关实施,basic_string<_CharT, _Traits, _Alloc>的代码:

  /**
   *  Returns true if the %string is empty.  Equivalent to *this == "".
   */
  bool
  empty() const
  { return this->size() == 0; }

讨论

即使这两个表单与std::string相同,但可能希望使用.empty(),因为它更为通用。

确实,J.F. Sebastian评论说,如果您切换到使用std::wstring而不是std::string,则==""甚至不会编译,因为您无法比较字符串wchar_tchar中的一个std::wstring。但是,这与您的原始问题没有直接关系,我99%确定您不会切换到{{1}}。

答案 1 :(得分:11)

应该是。 ANSI / ISO标准在21.3.3 basic_string capacity中声明:

  

size_type size() const;

     

返回:当前字符串中类似char的对象的数量。

     

bool empty() const;

     

退货: size() == 0

但是,在21.3.1 basic_string constructors的第18节中,它声明字符类型赋值运算符使用traits::length()来确定受控序列的长度,这样如果使用的话,最终会出现奇怪的结果。 std::basic_string<>的不同专业化。

我认为100%正确的陈述是

(str.empty() == (str == std::string()))

或类似的东西。如果您没有做任何奇怪的事情,那么std::string("")std::string()应该是等价的

它们在逻辑上相似,但它们正在测试不同的东西。 str.empty()正在检查字符串是否为空,而另一个正在检查C样式空字符串是否相等。我会使用哪个更适合你想要做的事情。如果您想知道字符串是否为空,请使用str.empty()

答案 2 :(得分:7)

str.empty()永远不会慢,但可能比str ==“”更快。这取决于实施。所以你应该使用str.empty()以防万一。

这有点像使用++ i代替i ++来增加计数器(假设你不需要增量运算符本身的结果)。您的编译器可能会进行优化,但是使用++ i会丢失任何东西,并且可能会赢得某些东西,所以最好使用++ i。

除性能问题外,您的问题的答案是肯定的;这两个表达式在逻辑上是等价的。

答案 3 :(得分:3)

对于(str.empty() == (str == ""))

std::string始终为* true。但请记住,string可以包含'\0'个字符。因此,即使表达式s == ""可能为false,s.c_str()仍可能返回空C字符串。例如:

#include <string>
#include <iostream>
using namespace std;

void test( const string & s ) {
    bool bempty = s.empty();
    bool beq = std::operator==(s, ""); // avoid global namespace operator==
    const char * res = (bempty == beq ) ? "PASS" : "FAIL";
    const char * isempty = bempty ? "    empty " : "NOT empty ";
    const char * iseq = beq ? "    == \"\"" : "NOT == \"\"";
    cout << res << " size=" << s.size();
    cout << " c_str=\"" << s.c_str() << "\" ";
    cout << isempty << iseq << endl;
}

int main() {
    string s;          test(s); // PASS size=0 c_str=""     empty     == ""
    s.push_back('\0'); test(s); // PASS size=1 c_str="" NOT empty NOT == ""
    s.push_back('x');  test(s); // PASS size=2 c_str="" NOT empty NOT == ""
    s.push_back('\0'); test(s); // PASS size=3 c_str="" NOT empty NOT == ""
    s.push_back('y');  test(s); // PASS size=4 c_str="" NOT empty NOT == ""
    return 0;
}

**禁止全局命名空间中operator==的重载,正如其他人提到的那样*

答案 4 :(得分:1)

某些实现可能会测试null字符作为字符串中的第一个字符,从而导致比计算字符串大小略微增加速度。

我认为这并不常见。

答案 5 :(得分:1)

通常,是的。

但如果某人决定重新定义一名运营商,那么所有投注都将被取消:

bool operator == (const std::string& a, const char b[])
{
    return a != b; // paging www.thedailywtf.com
}

答案 6 :(得分:0)

是的,它是等效的,但允许核心代码更改empty()实际意味着取决于操作系统/硬件/任何东西的实现,而不会影响您的代码。 Java和.NET中有类似的实践