Programing

string.empty와 string [0]의 차이점 == '\ 0'

lottogame 2020. 11. 23. 07:39
반응형

string.empty와 string [0]의 차이점 == '\ 0'


문자열이 있다고 가정합니다.

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

str.empty()의 차이점은 무엇입니까 str[0] == '\0'?


C ++ 11 이상

string_variable[0]문자열이 비어있는 경우 널 문자를 리턴하는 데 필요합니다. 이렇게하면 정의되지 않은 동작이 없으며 문자열이 실제로 비어있는 경우에도 비교가 작동합니다. 그러나 비어 있지 않아도 반환 하는 null 문자 ( )로 시작하는 문자열을 가질 있습니다 . 비어 있는지 정말로 알고 싶다면 ."\0Hi there"trueempty()


C ++ 11 이전

차이점은 문자열이 비어 있으면 string_variable[0]정의되지 않은 동작이 있다는 것입니다. 문자열이 규정되지 않으면 인덱스 0이 없습니다 const. 문자열 const 규정되면 널 문자를 리턴합니다.

string_variable.empty()반면에 문자열이 비어 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다. 동작은 정의되지 않습니다.


요약

empty()문자열 / 컨테이너가 비어 있는지 여부를 확인하기위한 것입니다. 그것은 그것을 제공하는 모든 컨테이너에서 작동하며 사용 empty은 의도 명확하게 나타냅니다. 즉, 코드를 읽는 사람들에게 많은 의미가 있습니다.


C ++ 11 이후로 str[str.size()] == '\0'. 즉, 문자열이 비어 있으면 str[0] == '\0'. 그러나 C ++ 문자열에는 명시적인 길이 필드가 있으므로 포함 된 null 문자를 포함 할 수 있습니다.

에 대한 예 std::string str("\0ab", 3), str[0] == '\0'하지만 str.empty()false입니다.

게다가, str.empty()보다 더 많은 읽을 수 있습니다 str[0] == '\0'.


여기에있는 다른 답변은 100 % 정확합니다. 세 가지 메모를 더 추가하고 싶습니다.

empty일반 상태 (모든 STL 컨테이너 구현이 함수)이다 operator []으로 size_t만 캐릭터 오브젝트 및 컨테이너 어레이 형상으로 작동한다. 일반 STL 코드를 다룰 때 empty선호됩니다.

또한 empty별로 자명 =='\0'하지 않지만 거의 자명 합니다. 그것의 오전 2시 당신이 당신의 코드를 디버깅 할 때, 당신은 볼 선호 if(str.empty())if(str[0] == '\0')? 기능 만 중요하다면 우리는 모두 바닐라 어셈블리로 작성합니다.

또한 성능이 저하됩니다. empty일반적으로 문자열의 크기 멤버를 0으로 비교하여 구현합니다. 이는 매우 저렴하고 인라인하기 쉽습니다. 첫 번째 문자와 비교하면 더 무거울 수 있습니다. 우선, 모든 문자열이 짧은 문자열 최적화를 구현하기 때문에 프로그램은 먼저 문자열이 "짧은 모드"인지 "긴 모드"인지 물어봐야합니다. 분기-성능 저하. 문자열이 길면 문자열이 잠시 "무시"되고 역 참조 자체로 인해 비용이 많이 드는 캐시 오류가 발생할 경우 역 참조하는 데 비용이 많이들 수 있습니다.


empty ()는 위치 0에서 null 문자의 존재를 찾는 것으로 구현되지 않습니다.

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

다를 수 있습니다


또한 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입니다.


C ++ 문자열에는 비어 있는지 여부에 대한 개념이 있습니다. 문자열이 비어 있으면 str [0]은 정의되지 않습니다. C ++ 문자열의 크기가> 1 인 경우에만 str [0]이 정의됩니다.

str [i] == '\ 0'은 C- 스트링 스타일의 개념입니다. C- 문자열 구현에서 문자열의 마지막 문자는 C- 문자열의 끝을 표시하는 '\ 0'입니다.
C- 문자열의 경우 일반적으로 별도의 변수를 사용하여 문자열 길이를 '기억'해야합니다. 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() will let you know the string is empty or not and str[0] == '\0' will let you know your strings 0 index contains '\0' or not. Your string variables 0 index contains '\0' doesn't mean that your string is empty. Yes, only once it can be possible when your string length is 1 and your string variables 0 index contains '\0'. That time you can say that, its an empty string.

참고URL : https://stackoverflow.com/questions/39725183/difference-between-string-empty-and-string0-0

반응형