在C语言中empty的用法,C ++:string.empty()是否始终等于string ==“”?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值