vector::empty() a vector::size() v C++ STL

vektory jsou stejná jako dynamická pole s možností automatické změny velikosti při vložení nebo odstranění prvku, přičemž jejich ukládání je automaticky řešeno kontejnerem.

vector::empty()

Funkce empty() se používá ke kontrole, zda je vektorový kontejner prázdný nebo ne.
Syntaxe:

  vectorname  .empty() Parameters : No parameters are passed. Returns : True, if vector is empty False, Otherwise 

Příklady:

Input : myvector = 1, 2, 3, 4, 5 myvector.empty(); Output : False Input : myvector = {} myvector.empty(); Output : True 

Časová náročnost - Konstanta O(1)

Chyby a výjimky
1. Nemá žádnou výjimku záruku házení.
2. Zobrazí chybu při předání parametru.

CPP




// CPP program to illustrate> // Implementation of empty() function> #include> #include> using> namespace> std;> int> main()> {> > vector <> int> >myvector{};> > if> (myvector.empty())> > {> > cout < <> 'True'> ;> > }> > else> {> > cout < <> 'False'> ;> > }> > return> 0;> }>

Výstup

True 

Aplikace :
Vzhledem k seznamu celých čísel najděte součet všech celých čísel.

Input : 1, 5, 6, 3, 9, 2 Output : 26 Explanation - 1+5+6+3+9+2 = 26 

Algoritmus
1. Zkontrolujte, zda je vektor prázdný, pokud ne, přidejte element back do proměnné inicializované jako 0 a vysuňte element back.
2. Tento krok opakujte, dokud nebude vektor prázdný.
3. Vytiskněte konečnou hodnotu proměnné.

CPP




// CPP program to illustrate> // Application of empty() function> #include> #include> using> namespace> std;> int> main()> {> > int> sum = 0;> > vector <> int> >mujvektor{ 1, 5, 6, 3, 9, 2 };> > while> (!myvector.empty())> > {> > sum = sum + myvector.back();> > myvector.pop_back();> > }> > cout < < sum;> > return> 0;> }>

Výstup

26 
vector::size()

Funkce size() se používá k vrácení velikosti vektorového kontejneru nebo počtu prvků ve vektorovém kontejneru.
Syntaxe:

  vectorname  .size() Parameters : No parameters are passed. Returns : Number of elements in the container. 

Příklady:

Input : myvector = 1, 2, 3, 4, 5 myvector.size(); Output : 5 Input : myvector = {} myvector.size(); Output : 0 

Časová složitost – Konstanta O(1)

Chyby a výjimky
1. Nemá žádnou výjimku záruku házení.
2. Zobrazí chybu při předání parametru.

CPP




// CPP program to illustrate> // Implementation of size() function> #include> #include> using> namespace> std;> int> main()> {> > vector <> int> >mujvektor{ 1, 2, 3, 4, 5 };> > cout < < myvector.size();> > return> 0;> }>

Výstup

5 

Proč má přednost empty() před size()
O funkci empty() se často říká, že je upřednostňována před funkcí size() kvůli některým z těchto bodů-

  1. funkce empty(). nepoužívá žádné porovnávací operátory , takže je pohodlnější používat
  2. Funkce empty() je implementován v konstantním čase , bez ohledu na typ kontejneru, zatímco některé implementace funkce size() vyžadují časovou složitost O(n), jako je list::size().

Aplikace :
Vzhledem k seznamu celých čísel najděte součet všech celých čísel.

Input : 1, 5, 6, 3, 9, 2 Output : 26 Explanation - 1+5+6+3+9+2 = 26 

Algoritmus
1. Zkontrolujte, zda je velikost vektoru 0, pokud ne, přidejte element back do proměnné inicializované jako 0 a vysuňte element back.
2. Tento krok opakujte, dokud nebude velikost vektoru 0.
3. Vytiskněte konečnou hodnotu proměnné.

CPP




// CPP program to illustrate> // Application of size() function> #include> #include> using> namespace> std;> int> main()> {> > int> sum = 0;> > vector <> int> >mujvektor{ 1, 5, 6, 3, 9, 2 };> > while> (myvector.size()>0) {> > sum = sum + myvector.back();> > myvector.pop_back();> > }> > cout < < sum;> > return> 0;> }>

Výstup

26 

Při používání size() musíme být opatrní.

Zvažte například následující program:

C++




#include> using> namespace> std;> int> main()> {> > // Initializing a vector of string type> > vector vec = {> 'Geeks'> ,> 'For'> ,> 'Geeks'> };> > for> (> int> i = 0 ; i <= vec.size() - 1 ; i++)> > cout < < vec[i] < <> ;> > return> 0;> }>

Výstup

Geeks For Geeks 

Výše uvedený program funguje dobře, ale nyní se podívejme na následující program:

C++




#include> using> namespace> std;> int> main()> {> > // Initializing a vector of string type> > vector vec = {> 'Geeks'> ,> 'For'> ,> 'Geeks'> };> > vec.clear();> > for> (> int> i = 0; i <= vec.size() - 1; i++)> > cout < < vec[i] < <> ;> > cout < <> 'Geeks For Geeks'> ;> > return> 0;> }>

Výstup:

Porucha segmentace SIGEGV

Zkompilováním výše uvedeného programu získáme Segmentation Fault (SIGSEGV), protože návratový typ size() je size_t, což je alias pro unsigned long int.-> unsigned long int var = 0;-> cout cout < < vec.size() – 1; // To se také bude rovnat 18446744073709551615

takže ve výše uvedeném programu procházíme smyčkou od i = 0 do i = 18446744073709551615

Nyní zvažte scénář, kdy odstraňujeme prvky z našeho inicializovaného kontejneru a po sekvenci operací se náš kontejner vyprázdní a nakonec vytiskneme obsah našeho kontejneru pomocí výše uvedené metody. Rozhodně to povede k chybě segmentace (SIGSEGV).

jak to opravit?

Je vhodné přetypovat kontejner.size() na celočíselný typ, abyste se vyhnuli Segmentation Fault (SIGSEGV).

C++




#include> using> namespace> std;> int> main()> {> > // Initializing a vector of string type> > vector vec = {> 'Geeks'> ,> 'For'> ,> 'Geeks'> };> > > // Clearing the vector> > // Now size is equal to 0> > vec.clear();> > > // Typecasting vec.size() to int> > for> (> int> i = 0; i <(> int> )vec.size() - 1; i++)> > cout < < vec[i] < <> ;> > cout < <> 'Geeks For Geeks'> ;> > return> 0;> }> // This code is contributed by Bhuwanesh Nainwal>

Výstup

Geeks For Geeks