Doporučená, 2021

Redakce Choice

Rozdíl mezi znakovým polem a řetězcem

C ++ podporuje jak pole znaků, tak řetězec, protože C ++ má značné výhody při používání obou. Ale neschopnost pracovat na znakovém poli vyvolává vývoj třídy řetězce. Pole znaků i řetězec obsahují posloupnost znaků. Základním rozdílem mezi znakovým polem a řetězcem je, že „znakové pole“ nelze provozovat se standardními operátory, zatímco „řetězcové“ objekty lze provozovat se standardními operátory. Podívejme se na další rozdíly mezi znakovým polem a řetězcem.

Srovnávací graf

Základ pro porovnáníZnakové poleŘetězec
ZákladníPole znaků je kolekce proměnných, typu datových znaků.Řetězec je třída a proměnné řetězce jsou objektem třídy "string".
Syntaxchar název_pole [velikost];řetězec string_name;
IndexováníK jednotlivému znaku v poli znaků lze přistupovat jeho indexem v poli.V řetězci lze k danému znaku přistupovat pomocí funkce "string_name.charAt (index)".
Datový typPole znaků nedefinuje datový typ.Řetězec definuje datový typ v C ++.
OperátořiOperátory v C ++ nelze použít na znakové pole.Na řetězec můžete použít standardní operátor C ++.
HraniceHranice pole lze snadno překročit.Hranice se nepřekročí.
PřístupRychlý přístup.Pomalý přístup.


Definice znakového pole

Pole znaků je soubor proměnných datového typu „char“; může to být jednorozměrné pole nebo dvourozměrné pole. Nazývá se také „null ukončený řetězec“. Pole znaků je posloupnost znaků, které jsou uloženy v po sobě jdoucích adresách paměti. V znakovém poli lze k určitému znaku přistupovat jeho indexem. “Nulový znak” ukončí pole znaků ”.

Vezměme si příklad pole znaků: -

 char name [] = {'A', 'j', 'a', 'y', '0'}; nebo char name [] = "Ajay"; 

Zde je „char“ znakový datový typ, „name“ je proměnný název znakového pole. Ukázal jsem dva způsoby, jak inicializovat pole znaků. V první metodě je explicitně uvedeno null a v druhé metodě kompilátor automaticky vloží hodnotu null.

Konec řetězce je vždy null; je to zakončovací znak matice znaků. Pole znaků není vestavěný typ dat; vytvoříme pole znaků deklarováním. Na pole znaků nelze použít standardní operátory. Pro práci s maticí znaků existuje nějaká vestavěná funkce, například (strlen (), strlwr (), strupr (), strcat ()). Jelikož standardní operátory nelze použít na znakové pole, nemohou se účastnit žádného výrazu.

Lze také vytvořit ukazatel znaku na pole znaků.

Pochopme to s příkladem.

 char s1 [] = "Dobrý den"; char s2 [] = "Sir"; s1 = s1 + s2; // chybové operátory nelze použít s2 = s1; // error Znak pointer char * s = "Ráno"; char * p; p = s; // provede 

Ve výše uvedeném příkladu jsme deklarovali dvě znaková pole s1, s2 a dva znakové ukazatele s a p. Pole znaků s1 a s2 jsou inicializována, můžeme vidět, že ani operátor přidávání (+) ani operátor přiřazení nepracuje na poli znaků. Ukazatel znaků však může být přiřazen jinému ukazateli znaků.

Pamatujte si, jakmile je pole znaků inicializováno, nemůže být znovu inicializováno na jinou sadu znaků. Přístup k znakovému poli nebo řetězci s nulovým ukončením je rychlý ve srovnání s řetězcem v jazyce C ++.

Definice řetězce

Řetězec není vestavěný datový typ C ++. Jedná se o objekt třídy typu „string“. Stejně jako v C ++ je vytváření třídy stejně jako vytváření „typu“. Třída „string“ je součástí knihovny C ++. Drží soubor znaku nebo znakového pole jako celku. Existují tři důvody vývoje standardní třídy řetězce.

  • Za prvé je to „konzistence“, znaková pole nejsou vlastními datovými typy.
  • Druhé je „pohodlí“, nelze použít standardní operátory na znakovém poli.
  • Třetí je „bezpečnost“, hranice pole lze snadno překročit.

Pojďme pochopit řetězce s příkladem.

 řetězec s1; s1 = "Dobrý den"; řetězec s2 ("Dobré ráno"); string s3 = "Hennery"; řetězec s4; 

Ve výše uvedeném prohlášení jsou deklarovány čtyři řetězcové proměnné nebo objekty (s1, s2, s3, s4). Ve výše uvedeném prohlášení jsem ukázal tři způsoby inicializace řetězce. Řetězec s1 je deklarován a pak samostatně inicializován. Řetězec s2 je inicializován konstruktorem třídy „String“. Řetězec s3 je inicializován v okamžiku jeho deklarace jako normální datový typ. Standardní proměnné můžeme aplikovat na řetězcové proměnné.

 s4 = s1; // přiřazení jednoho objektu řetězce jinému s4 = s1 + s2; // přidání dvou řetězců a uložení výsledku do třetího řetězce, pokud (s3> s2) // porovnání dvou řetězců s5 (s1); vytvoření nového objektu řetězce pomocí existujícího objektu řetězce 

Ve výše uvedeném kódu jsou na řetězec aplikovány různé operátory a jsou prováděny různé operace. První příkaz zkopíruje jeden objekt řetězce do jiného objektu řetězce. Ve druhém příkazu jsou dva řetězce zřetězeny a uloženy ve třetím řetězci. Ve třetím příkazu jsou porovnány dva řetězce. Ve čtvrtém příkazu je vytvořen nový objekt řetězce pomocí již existujícího objektu řetězce.

Přístup k řetězci je pomalý ve srovnání s maticí znaků nebo řetězcem s nulovým ukončením.

Klíčové rozdíly mezi znakovým polem a řetězcem

  1. Pole znaků je kolekce proměnných, které mají znakový datový typ. Řetězec je třída, která je instalována pro deklaraci řetězců.
  2. Pomocí hodnoty indexu můžete přistupovat k znaku z matice znaků. Na druhé straně, pokud chcete získat přístup k určitému znaku v řetězci, můžete k němu přistupovat pomocí funkce string's_name.charAt (index).
  3. Jako pole není datový typ podobně znak také není datový typ. Na druhou stranu, String je třída, která se chová jako referenční typ, proto může být řečeno, že String je datový typ.
  4. Na znakové pole nelze použít žádný operátor, zatímco na String můžete použít operátory.
  5. Být maticové pole má pevnou délku a jeho hranice lze snadno překročit. Kde String nemá žádné hranice.
  6. Prvky pole jsou uloženy v souvislém paměťovém místě, takže lze přistupovat rychleji než řetězcová proměnná.

Závěr:

Neschopnost pracovat na znakovém poli zvýšila vývoj standardní třídy stringů.

Top