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_t
string与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有类似的做法