přejít na obsah přejít na navigaci

Linux E X P R E S, Programovanie v jazyku C++: Knižnica string – funkcie append a capacity

Programovanie v jazyku C++: Knižnica string – funkcie append a capacity

C++

V článku sa pozrieme na funkciu append, s ktorou môžeme konštruovať reťazce ako chceme a funkciu capacity, ktorá nám ukáže aktuálne alokovanú veľkosť pamäte pre reťazec. 


Funkcia append

S funkciou append môžme doslova skladať reťazce a nielen to. Má podobné deklarácie ako konštruktor, ktorý sme si vysvetlili v minulom článku. Funkcia pridáva ďalšie znaky podľa našej implementácie na koniec daného reťazca. Poďme sa pozrieť na program.

1. program: Využitie funkcie append

#include <iostream>  // hlavickové súbory
#include <string>
using namespace std;   // priestor mien

int main()   // hlavna funkcia main
{
    string retazec1 = "Som z rodu Homo ";
    string retazec2 = retazec1.append("sapiens sapiens!");   // 1. sposob

    cout << retazec2 << "\n";

    string retazec3;
    string retazec4 = "Mal som dejavu, ako keby som ju uz niekedy videl.";
    retazec3.append(retazec4);   // 2. sposob

    cout << retazec3 <<"\n";

    string retazec5;
    string retazec6 = "Pozri sa na severnu stranu oblohy, vidis tu nehybnu hviezdu? Tak to je Polarka!";
    retazec5.append(retazec6, retazec6.size()-8,7);   // 3. sposob

    cout << retazec5 << "\n";

    string retazec7;
    retazec7.append("Moj milasik, budes len moj!", 11);   // 4. sposob

    cout << retazec7 << "\n";

    string retazec8;
    cout << "S" <<retazec8.append(7, 's') << ", pocul si to? Snad nemame v dome hada!" << "\n";  // 5. sposob

    string retazec9 = "Kdesi v tvojich slov som sa stratil, asi navzdy :(";
    string retazec10;
    retazec10.append(retazec9.end()-2, retazec9.end());   // 6. sposob

    cout << retazec10 << "\n";

    string retazec11;
    cout << "Kupte si nieco z autobazaru " << retazec11.append<int>(3, 0x41) << " AUTO!";   // 7. sposob

    return 0;   // koniec programu
}

Výsledok programu:

Som z rodu Homo sapiens sapiens!
Mal som dejavu, ako keby som ju uz niekedy videl.
Polarka
Moj milasik
Ssssssss, pocul si to? Snad nemame v dome hada!
:(
Kupte si nieco z autobazaru AAA AUTO!

Rozbor programu:

Teraz si poďme zhrnúť jednotlivé použitia funkcie append.

1.spôsob: mal by byť jasný

2.spôsob: mal by byť jasný

3.spôsob: druhý argument predstavuje prvú pozíciu v reťazci, od ktorej funkcia append začne kopírovať do prázdneho reťazca a tretí argument znamená počet znakov od prvej pozície v reťazci, ktoré sa skopírujú do nového reťazca

4.spôsob: druhý argument znamená počet znakov od nultej pozícii, ktoré sa majú skopírovať do nového reťazca

5.spôsob: prvý argument je počet znakov a druhý argument samotný znak, ktorý má byť v reťazci

6.spôsob: prvý argument predstavuje začiatočnú pozíciu v reťazci, druhý konečnú

7.spôsob: tu definujeme zoznam, prvý argument je počet znakov, ktoré sa majú do reťazca pridať a druhý argument znak v ASCII kóde, ale v hexadecimálnej podobe

Funkcia capacity

Ako ste si už všimli, keď robíme s objektom string z rovnakomennej knižnice, absolútne nás netrápi veľkosť poľa. Nemusíme sa starať, či sme počas behu programu prekročili náš definovaný limit pre reťazec. V jazyku C sa s tým človek veľmi natrápi. Našťastie v jazyku C++ nám tieto problémy odpadajú.

Ale ako to v skutočností funguje? Ono totižto vždy, keď objekt string začne byť hladný po pamäti, tak ju dostane. Keďže veľkosť reťazca je viazaný na integrálny typ size_t, tak maximálnu pridelenú veľkosť, ktorú môže dostať objekt string, je maximálna hodnota integrálneho typu size_t.

Takže už chápeme, ako dostáva objekt string veľkosť a ak chceme zistiť aktuálne pridelenú pamäť pre objekt string, tak využijeme funkciu capacity.

2. program:

#include <iostream>  // hlavickové súbory
#include <string>
using namespace std;   // priestor mien

int main()   // hlavna funkcia main
{
    string retazec1 = "Misia na Jupiter sa nepodarila, ale nadeje nekoncia, k Jupiteru sa este dostaneme!";
    string retazec2 = "Odkedy som sa prestahoval do New Yorku, cnie sa mi za domovom :(";
    string retazec3 = "Rozum kaze, vykasli sa na nu ale s citmi bojovat je nemozne!";

    cout << "1.retazec: velkost - "<<retazec1.size()<<"  kapacita - "<<retazec1.capacity()<<"\n";
    cout << "2.retazec: velkost - "<<retazec2.size()<<"  kapacita - "<<retazec2.capacity()<<"\n";
    cout << "3.retazec: velkost - "<<retazec3.size()<<"  kapacita - "<<retazec3.capacity()<<"\n";

    return 0;   // koniec programu
}

Výsledok programu:

1.retazec: velkost - 82  kapacita - 82
2.retazec: velkost - 64  kapacita - 64
3.retazec: velkost - 60  kapacita - 60

Rozbor programu: Mali sme šťastie (resp. ja), alokovaná pamäť bola rovnaká ako veľkosť reťazca, čo je logické. Ale nespoliehajte sa, že to vždy tak bude a preto nepoužívajte funkciu capacity ako náhradu funkcie size!

Nahoru

Příspěvky

Programovanie v jazyku C++: Knižnica string – funkcie append a capacity
Tomas 23. 09. 2017, 20:15:42
Odpovědět  Odkaz 
A v akom pripade moze mat size() inu hodnotu ako capacity()?
Eduard Boldižár Re: Programovanie v jazyku C++: Knižnica string – funkcie append a capacity
Eduard Boldižár 24. 09. 2017, 15:53:15
Odpovědět  Odkaz 
To je dobrá otázka, odpoveď vie len samotný systém, ktorý prideľuje pamäť pre reťazec
Re: Re: Programovanie v jazyku C++: Knižnica string – funkcie append a capacity
Tomas 24. 09. 2017, 19:16:54
Odpovědět  Odkaz 
Nebude to tak, ze capacity() vracia maximalnu vyalokovanu velkost retazca vlozeneho do string a size() jeho aktualnu velkost v string?
napr.:

string text;

text.assign("jeden");
// capacity() aj size() vratia 5
text.assign("dva");
// capacity() 5 a size() 3

Přidat názor

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz