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。