我可以假设给定
std::string str;
... // do something to str
以下陈述是否始终为真?
(str.empty() == (str == ""))
答案 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_t
与char
中的一个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中有类似的实践