Verschil tussen string.empty en string[0] == ‘\0’

Stel dat we een string hebben

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

Wat is het verschil tussen str.empty()en str[0] == '\0'?


Antwoord 1, autoriteit 100%

C++11 en verder

string_variable[0]is vereist om het null-teken te retourneren als de string leeg is. Op die manier is er geen ongedefinieerd gedrag en werkt de vergelijking nog steeds als de string echt leeg is. U zou echtereen tekenreeks kunnen hebben die begint met een null-teken ("\0Hi there") die trueretourneert, ook al is deze niet leeg. Als je echt wilt weten of het leeg is, gebruik dan empty().


Pre-C++11

Het verschil is dat als de string leeg is, string_variable[0]ongedefinieerd gedrag vertoont; Er is geen index 0 tenzij de tekenreeks const-gekwalificeerd is. Als de tekenreeks isconstgekwalificeerd, wordt een null-teken geretourneerd.

string_variable.empty()aan de andere kant retourneert waar als de tekenreeks leeg is, en onwaar als dat niet het geval is; het gedrag zal niet ongedefinieerd zijn.


Samenvatting

empty()is bedoeld om te controleren of de string/container leeg is of niet. Het werkt op alle containers die het leveren en het gebruik van emptygeeft duidelijk je intentie aan – wat veel betekent voor mensen die je code lezen (inclusief jou).


Antwoord 2, autoriteit 41%

Sinds C++11 is het gegarandeerd dat str[str.size()] == '\0'. Dit betekent dat als een string leeg is, dan str[0] == '\0'. Maar een C++-tekenreeks heeft een expliciet lengteveld, wat betekent dat het ingesloten null-tekens kan bevatten.

Bijvoorbeeld voor std::string str("\0ab", 3), str[0] == '\0'maar str.empty()is onwaar.

Bovendien is str.empty()beter leesbaar dan str[0] == '\0'.


Antwoord 3, autoriteit 26%

Andere antwoorden hier zijn 100% correct. Ik wil nog drie opmerkingen toevoegen:

emptyis generiek (elke STL-container implementeert deze functie) terwijl operator []met size_talleen werkt met string-objecten en array-achtige containers. als het om generieke STL-code gaat, heeft emptyde voorkeur.

ook, emptyis vrij duidelijk, terwijl =='\0'niet erg veel is.
als het 2 uur ‘s nachts is en je debugt je code, zou je dan liever if(str.empty())of if(str[0] == '\0')zien?
als alleen functionaliteit ertoe doet, zouden we allemaal in vanilla-assemblage schrijven.

er is ook een prestatiestraf aan verbonden. emptywordt meestal geïmplementeerd door het maatlid van de tekenreeks te vergelijken met nul, wat erg goedkoop is, gemakkelijk te inline is, enz. vergelijken met het eerste teken kan zwaarder zijn. ten eerste, aangezien alle strings korte string-optimalisatieimplementeren, moet het programma eerst vragen of de string in “korte modus” of “lange modus” staat. vertakking – slechtere prestaties. als de tekenreeks lang is, kan het dereferentie kostbaar zijn als de tekenreeks enige tijd “genegeerd” is en de dereferentie zelf kan een cachefout veroorzaken die kostbaar is.


Antwoord 4, autoriteit 7%

empty() is niet geïmplementeerd als het zoeken naar het bestaan ​​van een null-teken op positie 0, het is gewoon

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

Wat anders kan zijn


Antwoord 5, autoriteit 4%

Pas ook op voor de functies die u gaat gebruiken als u C++ 11 of een latere versie gebruikt:

#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;
}

zal terugkeren

De grootte van str is 3 bytes.

De maat van str is 3 lang.

De grootte van str is 0 lang.


Antwoord 6, autoriteit 3%

Je wilt het verschil weten tussen str.empty() and str[0] == '\0'. Laten we het voorbeeld volgen:

#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;
}

Uitvoer:

str is empty
str2 contains: alues

str.empty()laat je weten dat de string leeg is of niet en str[0] == '\0'laat je weten wat je strings zijn 0 index bevat '\0'of niet. Uw tekenreeksvariabelen 0 index bevat '\0'betekent niet dat uw tekenreeks leeg is. Ja, het kan maar één keer mogelijk zijn wanneer uw stringlengte 1 is en uw stringvariabelen 0 index '\0'bevat. Die keer kun je dat zeggen, het is een lege string.


Antwoord 7, autoriteit 3%

C++ string heeft het concept of het leeg is of niet. Als de string leeg is, is str[0] niet gedefinieerd. Alleen als de C++-tekenreeks de grootte >1 heeft, is str[0] gedefinieerd.

str[i] == ‘\0’ is een concept van de C-snaarstijl. Bij de implementatie van C-string is het laatste teken van de string ‘\0’ om het einde van een C-string te markeren.
Voor C-string moet je meestal de lengte van je string ‘onthouden’ met een aparte variabele. In C++ String kun je elke positie toewijzen met ‘\0’.

Gewoon een stukje code om mee te spelen:

#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;
}

Op mijn machine de output:

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

Other episodes