我可以假设给定
std::string str; ... // do something to str
以下陈述是否总是如此?
(str.empty() == (str == ""))
A. Rex.. 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()
它,因为它更通用.
事实上,JF塞巴斯蒂安评论说,如果切换到使用std::wstring
替代的std::string
,那么==""
甚至不会编译,因为你不能一串比较wchar_t
与之一char
.但是,这与您的原始问题没有直接关系,我99%肯定您不会切换到std::wstring
.
是.以下是相关实现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()
它,因为它更通用.
事实上,JF塞巴斯蒂安评论说,如果切换到使用std::wstring
替代的std::string
,那么==""
甚至不会编译,因为你不能一串比较wchar_t
与之一char
.但是,这与您的原始问题没有直接关系,我99%肯定您不会切换到std::wstring
.
它应该是.ANSI/ISO标准规定了21.3.3 basic_string
容量:
size_type size() const;
返回:当前在字符串中的类似char的对象的计数.
bool empty() const;
返回:
size() == 0
但是,在21.3.1 basic_string
构造函数的第18节中,它指出字符类型赋值运算符用于traits::length()
建立受控序列的长度,因此如果使用不同的特化,则可能会出现奇怪的结果std::basic_string<>
.
我认为100%正确的说法就是这样
(str.empty() == (str == std::string()))
或类似的东西.如果你还没有做什么奇怪的,然后std::string("")
和std::string()
应该是等价的
它们在逻辑上相似,但它们正在测试不同的东西.str.empty()
正在检查字符串是否为空,而另一个正在检查C样式空字符串是否相等.我会使用哪个更适合你想要做的事情.如果您想知道字符串是否为空,请使用str.empty()
.
str.empty()永远不会慢,但可能比str ==""更快.这取决于实施.所以你应该使用str.empty()以防万一.
这有点像使用++ i而不是i ++来增加计数器(假设您不需要增量运算符本身的结果).您的编译器可能会进行优化,但是使用++ i并没有失去任何东西,并且可能会赢得一些东西,所以最好使用++ i.
除了性能问题,你的问题的答案是肯定的; 两个表达式在逻辑上是等价的.