C ++:string.empty()是否始终等于string ==“”?

我可以假设

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

以下陈述是否总是正确的?

(str.empty() == (str == ""))
Michael asked 2020-02-23T01:48:53Z
7个解决方案
52 votes

回答

是。 这是std::wstring的相关实现,代码std::string

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

讨论区

即使两种形式对于std::wstring是等效的,您也可能希望使用std::string,因为它更通用。

实际上,JF Sebastian评论说,如果切换到使用std::wstring而不是=="",则==""甚至都不会编译,因为您无法将wchar_t的字符串与char中的一个进行比较。但是,这与您的原始内容并不直接相关。 问题,我99%肯定您不会切换到std::wstring

A. Rex answered 2020-02-23T01:49:24Z
11 votes

它应该是。 ANSI / ISO标准在21.3.3 str.empty()容量中声明:

str.empty()

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

str.empty()

回报:str.empty()

但是,在21.3.1 str.empty()构造函数的第18条中,它声明字符类型赋值运算符使用str.empty()来建立受控序列的长度,因此,如果您使用的是str.empty()的另一种特殊化,则可能会遇到奇怪的情况。

我认为100%正确的说法是

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

或类似的东西。 如果您没有做任何奇怪的事情,那么str.empty()str.empty()应该等效

它们在逻辑上相似,但是它们正在测试不同的事物。 str.empty()正在检查字符串是否为空,而另一个正在针对C样式的空字符串检查是否相等。 我将使用更适合您尝试执行的操作。 如果您想知道字符串是否为空,请使用str.empty()

D.Shawley answered 2020-02-23T01:50:20Z
7 votes

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

这有点像使用++ i而不是i ++来增加计数器(假设您不需要增量运算符本身的结果)。 您的编译器可能会优化,但是使用++ i不会让您一无所获,并且可能会赢得一些好处,因此使用++ i更好。

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

Gorpik answered 2020-02-23T01:50:50Z
3 votes

是的,对于std::string,始终为operator== * true。但是请记住,string可以包含'\0'个字符。 因此,尽管表达式s == ""可能为假,但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==重载*

jwfearn answered 2020-02-23T01:51:15Z
1 votes

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

我相信这并不普遍。

Jesse Dearing answered 2020-02-23T01:51:40Z
1 votes

通常是的。

但是,如果有人决定重新定义运算符,那么所有的赌注都被取消:

bool operator == (const std::string& a, const char b[])
{
    return a != b; // paging www.thedailywtf.com
}
John Carter answered 2020-02-23T01:52:04Z
0 votes

是的,它是等效的,但允许核心代码根据OS /硬件/任何东西更改empty()实际含义的实现,而完全不影响您的代码。 Java和.NET中有类似的实践

Ray Booysen answered 2020-02-23T01:52:24Z
translate from https://stackoverflow.com:/questions/483337/c-is-string-empty-always-equivalent-to-string