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
#include
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