假设我们有一个字符串
std::string str; // some value is assigned
str.empty()
和str[0] == '\0'
之间的区别是什么?
答案 0 :(得分:91)
string_variable[0]
返回空字符。这样就没有未定义的行为,如果字符串真的为空,比较仍然有效。但是可能有一个以空字符("\0Hi there"
)开头的字符串,即使它不为空,也会返回true
。如果您真的想知道它是否为空,请使用empty()
。
不同之处在于,如果字符串为空,则string_variable[0]
具有未定义的行为;除非字符串为const
,否则没有索引0。如果字符串是 const
限定的,那么它将返回一个空字符。
string_variable.empty()
如果字符串为空则返回true,如果不是则返回false;这种行为不会被定义。
empty()
用于检查字符串/容器是否为空。它适用于提供它的所有容器,并使用empty
清楚地表明您的意图 - 这对于阅读代码的人(包括您)来说意味着很多。
答案 1 :(得分:36)
从C ++ 11开始,保证str[str.size()] == '\0'
。这意味着如果字符串为空,则为str[0] == '\0'
。但是C ++字符串有一个显式长度字段,这意味着它可以包含嵌入的空字符。
E.g。对于std::string str("\0ab", 3)
,str[0] == '\0'
但str.empty()
为假。
此外,str.empty()
比str[0] == '\0'
更具可读性。
答案 2 :(得分:24)
此处的其他答案100%正确。我只想添加三个注释:
empty
是通用的(每个STL容器实现此函数),而operator []
size_t
仅适用于字符串对象和类似数组的容器。在处理通用STL代码时,首选empty
。
另外,empty
几乎是自我解释,而=='\0'
并不是很多。
当它是凌晨2点并且您调试代码时,您希望看到if(str.empty())
还是if(str[0] == '\0')
?
如果只有功能很重要,我们都会用香草汇编来写。
还涉及性能损失。 empty
通常是通过将字符串的size成员与零进行比较来实现的,这非常便宜,易于内联等。与第一个字符进行比较可能会更加繁重。首先,由于所有字符串都实现短字符串优化,程序首先要询问字符串是处于“短模式”还是“长模式”。分支 - 性能更差。如果字符串很长,如果字符串被“忽略”一段时间并且解除引用本身可能导致高速缓存错误,那么取消引用它可能会很昂贵。
答案 3 :(得分:6)
empty()未实现为在位置0处查找空字符的存在,而只是
tty
哪个可能不同
答案 4 :(得分:4)
另外,请注意使用C ++ 11或更高版本时将使用的功能:
#include <iostream>
#include <cstring>
int main() {
std::string str("\0ab", 3);
std::cout << "The size of str is " << str.size() << " bytes.\n";
std::cout << "The size of str is " << str.length() << " long.\n";
std::cout << "The size of str is " << std::strlen(str.c_str()) << " long.\n";
return 0;
}
将返回
str的大小是3个字节。
str的大小是3长。
str的大小为0长。
答案 5 :(得分:3)
C ++字符串具有是否为空的概念。如果字符串为空,则str [0]未定义。仅当C ++字符串的大小> 1时,才定义str [0]。
str [i] ==&#39; \ 0&#39;是C-string风格的概念。在C-string的实现中,字符串的最后一个字符是&#39; \ 0&#39;标记C字符串的结尾。
对于C字符串,您通常必须记住&#39;带有单独变量的字符串的长度。在C ++字符串中,您可以使用&#39; \ 0&#39;。
只需使用代码段:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[]) {
char str[5] = "abc";
cout << str << " length: " << strlen(str) << endl;
cout << "char at 4th position: " << str[3] << "|" << endl;
cout << "char at 5th position: " << str[4] << "|" << endl;
str[4]='X'; // this is OK, since Cstring is just an array of char!
cout << "char at 5th position after assignment: " << str[4] << "|" << endl;
string cppstr("abc");
cppstr.resize(3);
cout << "cppstr: " << cppstr << " length: " << cppstr.length() << endl;
cout << "char at 4th position:" << cppstr[3] << endl;
cout << "char at 401th positon:" << cppstr[400] << endl;
// you should be getting segmentation fault in the
// above two lines! But this may not happen every time.
cppstr[0] = '\0';
str[0] = '\0';
cout << "After zero the first char. Cstring: " << str << " length: " << strlen(str) << " | C++String: " << cppstr << " length: " << cppstr.length() << endl;
return 0;
}
abc length: 3
char at 4th position: |
char at 5th position: |
char at 5th position after assignment: X|
cppstr: abc length: 3
char at 4th position:
char at 401th positon:?
After zero the first char. Cstring: length: 0 | C++String: bc length: 3
答案 6 :(得分:2)
您想了解str.empty() and str[0] == '\0'
之间的区别。让我们按照例子:
#include<iostream>
#include<string>
using namespace std;
int main(){
string str, str2; //both string is empty
str2 = "values"; //assigning a value to 'str2' string
str2[0] = '\0'; //assigning '\0' to str2[0], to make sure i have '\0' at 0 index
if(str.empty()) cout << "str is empty" << endl;
else cout << "str contains: " << str << endl;
if(str2.empty()) cout << "str2 is empty" << endl;
else cout << "str2 contains: " << str2 << endl;
return 0;
}
输出:
str is empty
str2 contains: alues
str.empty()
会告诉您字符串是否为空,str[0] == '\0'
会让您知道您的字符串0索引是否包含'\0'
。您的字符串变量0索引包含'\0'
并不意味着您的字符串为空。是的,只有在字符串长度为1且字符串变量0索引包含'\0'
时才可能。那个时候你可以这么说,它是一个空字符串。