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

假设我们有一个string

std::string str; // some value is assigned 

str.empty()str[0] == '\0'什么区别?

C ++ 11及更高版本

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


预C ++ 11

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

string_variable.empty()如果string为空则返回true,否则返回false。 行为将不会被定义。


概要

empty()是为了检查string/容器是否为空。 它适用于所有提供它的容器,使用empty清楚地说明你的意图 – 这对于阅读你的代码的人(包括你)意义重大。

由于C ++ 11保证str[str.size()] == '\0' 。 这意味着如果一个string是空的,那么str[0] == '\0' 。 但是一个C ++string有一个明确的长度字段,这意味着它可以包含embedded的空字符。

例如,对于std::string str("\0ab", 3)str[0] == '\0'str.empty()为false。

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

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

empty是通用的(每个STL容器都实现这个function),而size_t operator []只能用于string对象和类似数组的容器。 当处理通用的STL代码时, empty是首选。

另外, empty是非常自我解释,而=='\0'不是很多。 当它是凌晨2点,你debugging你的代码,你想看看if(str.empty())if(str[0] == '\0') ? 如果只有function很重要,我们都会用香草assembly。

还涉及到性能问题。 empty通常通过将string的大小成员与零比较来实现,这非常便宜,易于内联等,与第一个字符比较可能更重。 首先,由于所有的string都实现了短string优化 ,因此程序首先要询问string是处于“短模式”还是“长模式”。 分支 – 性能较差。 如果string很长,那么如果string被“忽略”了一段时间,则解引用它可能是昂贵的,并且解引用本身可能导致高成本的高速caching故障。

empty()没有被实现为在位置0处寻找空字符的存在,它简单地

 bool empty() const { return size() == 0 ; } 

这可能是不同的

另外,如果您使用C ++ 11或更高版本,请小心使用的function:

 #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。

C ++string具有是否为空的概念。 如果string是空的,那么str [0]是不确定的。 只有当C ++string的大小大于1时,才会定义str [0]。

str [i] =='\ 0'是Cstring风格的概念。 在Cstring的实现中,string的最后一个字符是'\ 0'来标记一个Cstring的结尾。
对于Cstring,您通常必须用一个单独的variables“记住”string的长度。 在C ++string中,您可以使用'\ 0'来指定任何位置。

只是一个代码段与玩:

 #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 

你想知道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()会让你知道string是否为空, str[0] == '\0'会让你知道你的string0索引是否包含'\0' 。 你的stringvariables0索引包含'\0'并不意味着你的string是空的。 是的,只有当你的string长度为1而你的stringvariables0索引包含'\0'时才有可能。 那个时候你可以说,它是一个空的string。