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

时间:2016-09-27 12:51:04

标签: c++ string

假设我们有一个字符串

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

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

7 个答案:

答案 0 :(得分:91)

C ++ 11及更高版本

如果字符串为空,则需要

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

预C ++ 11

不同之处在于,如果字符串为空,则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'时才可能。那个时候你可以这么说,它是一个空字符串。