Linux E X P R E S

Facebook

Programovanie v jazyku C++: Knižnica string – funkcie resize, reserve a shrink_to_fit

C++

V tomto diele si rozoberieme funkcie resize , reserve a shrink_to_fit . Umožnia nám napr. meniť veľkosť reťazca či ovplyvňovať kapacitu pridelenej pamäte pre reťazec. 


Funkcia resize

Funkcia resize nám umožní zmeniť veľkosť reťazca. Ako nato, ukážeme si v príklade.

1. príklad: Aplikácia funkcie resize

#include <iostream>   // hlavičkove subory
#include <string>

using namespace std;  // priestor mien

int main()
{
    string retazec1 = "Milujem hru Cities Skylines ;). Skus ju tiez";
    size_t i = retazec1.size();

    retazec1.resize(i+3, '!');   // prvy sposob
    cout << retazec1 << "\n";

    string retazec2 = "Amalka, laska mojho zivota, dnes neprisla na rande, chyba mi :(";
    size_t j = retazec2.size();

    retazec2.resize(j-37);   // druhy sposob
    cout << retazec2;

    return 0;  // koniec programu
}

Výsledok programu:

Milujem hru Cities Skylines ;). Skus ju tiez!!!
Amalka, laska mojho zivota

Rozbor programu:

1. spôsob: V prvom spôsobe chceme zväčšiť veľkosť reťazca. Ideálne ho aj naplniť nejakými znakmi. Preto prvý argument funkcie resize vyjadruje novú veľkosť reťazca a musí byť väčšia ako aktuálna hodnota veľkostí reťazca a druhým argumentom naplníme znakmi nové prázdne prvky.

2. spôsob: Ak chceme zmenšiť veľkosť reťazca, tak nám stačí napísať novú veľkosť reťazca v jedinom argumente.

Funkcia reserve

O pridelej pamäti sme sa už rozprávali pri vysvetľovaní funkcie capacity v tomto článku. Existuje funkcia, s ktorou môžme manipulovať s veľkosťou prideľovanej pamäte. Keďže objekt string si sam automatický manažuje pridelovanú pamäť, funkcia reserve je viacmenej kozmetickou funkciu. Avšak môže si nájsť uplatnenie a preto si ju i spomíname. Poďme si ukázať príklad.

2. príklad: Testujeme funkciu reserve

#include <iostream>   // hlavičkove subory
#include <string>

using namespace std;  // priestor mien

int main()
{
    string retazec = "Svet je jedna velka zlozita skladacka!";

    cout << "Prvy test: " << "velkost - "<<retazec.size()<<" kapacita - "<<retazec.capacity();
    retazec.reserve(38);
    cout << "\nDruhy test: " << "velkost - "<<retazec.size()<<" kapacita - "<<retazec.capacity();
    retazec.reserve(39);
    cout << "\nTreti test: " << "velkost - "<<retazec.size()<<" kapacita - "<<retazec.capacity();

    return 0;  // koniec programu
}

Výsledok programu:

Prvy test: velkost - 38 kapacita - 38
Druhy test: velkost - 38 kapacita - 38
Treti test: velkost - 38 kapacita – 76

Rozbor programu:

Už asi tušíte, ako pracuje funkcia reserve. Ak je argument rovný alebo menší ako veľkosť reťazca, tak sa nič neudeje. Ak väčší, tak až vtedy dôjde k zväčšeniu kapacity pridelenej pamäte.

Funkcia shrink_to_fit

Teraz poďme na to opačne ako pri funkcii reserve. Povedali sme si z akehokoľvek dôvodu, že máme vysokú kapacitu pridelenej pamäte a chceme, aby kapacita pridelenej pamäte bola rovná aktuálnej veľkostí reťazca. Vtedy využíjeme funkciu shrink_to_fit. Nie je však striktné prikázané, že kapacita musí byť rovná veľkostí reťazca, preto by malo dôjsť k zmenšeniu kapacity ale nemusí byť rovnaká ako veľkosť reťazca. Samozrejme o príklad nebudete ukradnutý.

Ešte poznámka, funkcia shrink_to_fit je podporovaná až vo verzii c++11 a vyššie. Ak kompilujete v termináli, tak príkaz na kompiláciu môže vyzerať takto:

g++ -std=c++11 menoSuboru.cpp -o menoSuboru

3. príklad: Testujeme funkciu shrink_to_fit

#include <iostream>   // hlavičkove subory
#include <string>

using namespace std;  // priestor mien

int main()
{
    string retazec = "Mozart a jeho rajsku hudbu milujem!";

    cout << "Prvy test: " << "velkost - "<<retazec.size()<<" kapacita - "<<retazec.capacity();
    retazec.resize(6);
    cout << "\nDruhy test: " << "velkost - "<<retazec.size()<<" kapacita - "<<retazec.capacity();
    retazec.shrink_to_fit();
    cout << "\nTreti test: " << "velkost - "<<retazec.size()<<" kapacita - "<<retazec.capacity();

    return 0;  // koniec programu
}

Výsledok programu:

Prvy test: velkost - 35 kapacita - 35
Druhy test: velkost - 6 kapacita - 35
Treti test: velkost - 6 kapacita – 6



Diskuze (0) Nahoru