假设我们有一个字符串
std::string str; // some value is assigned
Run Code Online (Sandbox Code Playgroud)
str.empty() 和之间有什么区别str[0] == '\0'?
Nat*_*ica 90
string_variable[0]如果字符串为空,则需要返回空字符.这样就没有未定义的行为,如果字符串真的为空,比较仍然有效.但是,您可以使用以null字符("\0Hi there")开头的字符串,true即使它不为空,也会返回.如果你真的想知道它是否为空,请使用empty().
不同之处在于,如果字符串为空,则string_variable[0]具有未定义的行为; 除非字符串是const-qualified,否则没有索引0 .如果字符串是 const合格的,那么它将返回一个空字符.
string_variable.empty()另一方面,如果字符串为空,则返回true;如果不是,则返回false; 行为不会被定义.
empty()用于检查字符串/容器是否为空.它适用于提供它的所有容器,并empty清楚地表明你的意图 - 这对于阅读你的代码(包括你)的人来说意义重大.
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'.
Dav*_*aim 24
这里的其他答案是100%正确的.我只想添加三个注释:
empty是通用的(每STL容器实现此功能),同时operator []与size_t只适用于字符串对象和阵列状的容器.在处理通用STL代码时,empty首选.
此外,empty是非常自我解释,而=='\0'不是很多.当它是凌晨2点并且您调试代码时,您更愿意看到if(str.empty())还是if(str[0] == '\0')?如果只有功能很重要,我们都会写香草汇编.
还涉及性能损失.empty通常通过将字符串的size成员比较为零来实现,这非常便宜,易于内联等.与第一个字符相比可能更重.首先,由于所有字符串都实现了短字符串优化,程序首先要询问字符串是处于"短模式"还是"长模式".分支 - 性能更差.如果字符串很长,如果字符串被"忽略"一段时间并且解除引用本身可能导致高速缓存错误,则取消引用它可能是昂贵的.
empty()未实现为在位置0处查找空字符的存在,简单地说就是这样
bool empty() const
{
return size() == 0 ;
}
Run Code Online (Sandbox Code Playgroud)
哪个可能不同
| 归档时间: |
|
| 查看次数: |
8254 次 |
| 最近记录: |