string.empty和string [0] =='\ 0'之间的区别

Pro*_*unt 63 c++ string

假设我们有一个字符串

std::string str; // some value is assigned
Run Code Online (Sandbox Code Playgroud)

str.empty() 和之间有什么区别str[0] == '\0'

Nat*_*ica 90

C++ 11及更高版本

string_variable[0]如果字符串为空,则需要返回空字符.这样就没有未定义的行为,如果字符串真的为空,比较仍然有效.但是,您可以使用以null字符("\0Hi there")开头的字符串,true即使它不为空,也会返回.如果你真的想知道它是否为空,请使用empty().


预C++ 11

不同之处在于,如果字符串为空,则string_variable[0]具有未定义的行为; 除非字符串是const-qualified,否则没有索引0 .如果字符串 const合格的,那么它将返回一个空字符.

string_variable.empty()另一方面,如果字符串为空,则返回true;如果不是,则返回false; 行为不会被定义.


摘要

empty()用于检查字符串/容器是否为空.它适用于提供它的所有容器,并empty清楚地表明你的意图 - 这对于阅读你的代码(包括你)的人来说意义重大.

  • `empty()`也适用于`std :: u16string`,无需更改代码 (14认同)
  • @LightnessRacesinOrbit:实际上,它是一个程序的特定执行,其行为是定义的或未定义的.只有当程序的控制流通过其行为未定义的操作或构造时,才会触发"未定义的行为".奇怪的是,该程序在达到这一点之前可能会开始行为不端,但前提是它确实到达那里.可以非常明确地定义在不同输入上执行相同程序的另一个执行,该操作导致围绕有问题的操作的分支. (2认同)

Obe*_*ron 36

从C++ 11开始就可以保证str[str.size()] == '\0'.这意味着如果字符串为空,那么str[0] == '\0'.但是C++字符串具有显式长度字段,这意味着它可以包含嵌入的空字符.

例如std::string str("\0ab", 3),str[0] == '\0'但是str.empty()是假的.

此外,str.empty()更具可读性str[0] == '\0'.

  • 由于评论在没有通知的情况下被销毁,我将不得不再说一遍(感谢那些人):@QPaysTaxes只是为了让你和其他读者知道(你说"我认为"这表明你不确定),正确你评论的一部分是最后一部分.不是第一部分,不是. (3认同)

Dav*_*aim 24

这里的其他答案是100%正确的.我只想添加三个注释:

empty是通用的(每STL容器实现此功能),同时operator []size_t只适用于字符串对象和阵列状的容器.在处理通用STL代码时,empty首选.

此外,empty是非常自我解释,而=='\0'不是很多.当它是凌晨2点并且您调试代码时,您更愿意看到if(str.empty())还是if(str[0] == '\0')?如果只有功能很重要,我们都会写香草汇编.

还涉及性能损失.empty通常通过将字符串的size成员比较为零来实现,这非常便宜,易于内联等.与第一个字符相比可能更重.首先,由于所有字符串都实现了短字符串优化,程序首先要询问字符串是处于"短模式"还是"长模式".分支 - 性能更差.如果字符串很长,如果字符串被"忽略"一段时间并且解除引用本身可能导致高速缓存错误,则取消引用它可能是昂贵的.


MyD*_*Day 6

empty()未实现为在位置0处查找空字符的存在,简单地说就是这样

bool empty() const
{
    return size() == 0 ;
}
Run Code Online (Sandbox Code Playgroud)

哪个可能不同