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

我可以做一个假设,给出

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

以下陈述总是如此吗?

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

回答

是。 下面是来自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; } 

讨论

尽pipe这两个表单对于std::string是等价的,但是您可能希望使用.empty()因为它更一般。

事实上, JF Sebastian评论说,如果切换到使用std::wstring而不是std::string ,那么==""甚至不会编译,因为你不能将一个wchar_tstring与char之一进行比较。 但是,这与您的原始问题并不直接相关,我确定您不会切换到std::wstring

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

size_type size() const;

返回:当前在string中的类字符对象的计数。

bool empty() const;

返回: size() == 0

然而,在21.3.1 basic_string构造函数的第18节中,它指出字符types赋值操作符使用traits::length()来确定受控序列的长度,所以如果使用不同的专门化std::basic_string<>

我认为100%正确的陈述是

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

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

他们在逻辑上相似,但他们正在testing不同的事情。 str.empty()检查string是否为空,而另一个检查是否与C风格的空string相等。 我会使用哪个更适合你正在做的事情。 如果你想知道一个string是否为空,那么使用str.empty()

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

这有点像使用++而不是i ++来增加计数器(假设你不需要增量运算符本身的结果)。 你的编译器可能会优化,但是使用++ i我什么也没有损失,可能会赢得一些东西,所以你最好使用++ i。

除了performance问题,你的问题的答案是肯定的; 两个expression式在逻辑上是等同的。

(str.empty() == (str == ""))对于std::string总是* true。 但请记住,一个string可以包含'\0'字符。 所以即使expression式s == ""可能为false, s.c_str()仍然可能返回一个空的Cstring。 例如:

 #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==的重载,正如其他人所提到的那样*

一些实现可能会testing空字符作为string中的第一个字符,导致计算string大小的速度略微提高。

我相信这不是常见的。

通常,是的。

但是如果有人决定重新定义一个操作员,那么所有的投注都将被closures:

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

是的,它是等价的,但允许核心代码根据操作系统/硬件/任何东西来改变empty()实际意义的实现,而不会影响你的代码。 Java和.NET有类似的做法