vector::empty() i vector::size() en C++ STL

Vectors són els mateixos que les matrius dinàmiques amb la possibilitat de canviar la mida automàticament quan s'insereix o s'elimina un element, amb el seu emmagatzematge gestionat automàticament pel contenidor.

vector::buit()

La funció empty() s'utilitza per comprovar si el contenidor vectorial està buit o no.
Sintaxi:

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

Exemples:

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

Complexitat temporal - constant O(1)

Errors i excepcions
1. No té cap excepció garantia de llançament.
2. Mostra un error quan es passa un paràmetre.

CPP




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

Sortida

True 

Aplicació:
Donada una llista de nombres enters, troba la suma de tots els nombres enters.

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

Algoritme
1. Comproveu si el vector està buit, si no, afegiu l'element posterior a una variable inicialitzada com a 0, i feu clic a l'element posterior.
2. Repetiu aquest pas fins que el vector estigui buit.
3. Imprimeix el valor final de la variable.

CPP




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

Sortida

26 
vector::mida()

La funció size() s'utilitza per retornar la mida del contenidor vectorial o el nombre d'elements del contenidor vectorial.
Sintaxi:

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

Exemples:

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

Complexitat temporal – Constant O (1)

Errors i excepcions
1. No té cap excepció garantia de llançament.
2. Mostra un error quan es passa un paràmetre.

CPP




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

Sortida

5 

Per què es prefereix empty() a la mida()
Sovint es diu que la funció empty() és preferida a la funció size() a causa d'alguns d'aquests punts:

  1. funció empty(). no utilitza cap operador de comparació , per tant, és més còmode d'utilitzar
  2. La funció empty() és implementat en temps constant , independentment del tipus de contenidor, mentre que algunes implementacions de la funció size() requereixen complexitat de temps O(n), com ara list::size().

Aplicació:
Donada una llista de nombres enters, troba la suma de tots els nombres enters.

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

Algoritme
1. Comproveu si la mida del vector és 0, si no, afegiu l'element posterior a una variable inicialitzada com a 0, i feu clic a l'element posterior.
2. Repetiu aquest pas fins que la mida del vector sigui 0.
3. Imprimeix el valor final de la variable.

CPP




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

Sortida

26 

Hem de tenir cura quan utilitzem size().

Per exemple, considereu el programa següent:

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

Sortida

Geeks For Geeks 

El programa anterior funciona bé, però ara considerem el programa següent:

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

Sortida:

Falla de segmentació SIGEGV

En compilar el programa anterior, obtenim Segmentation Fault (SIGSEGV) perquè el tipus de retorn de size() és size_t, que és un àlies per unsigned long int.-> unsigned long int var = 0;-> cout cout < < vec.size() – 1; // Això també serà igual a 18446744073709551615

així que estem fent un bucle de i = 0 a i = 18446744073709551615 al programa anterior

Considereu ara l'escenari en què estem suprimint elements del nostre contenidor inicialitzat i després d'una seqüència d'operacions el nostre contenidor es buida i, finalment, estem imprimint el contingut del nostre contenidor mitjançant el mètode anterior. Definitivament, donarà lloc a un error de segmentació (SIGSEGV).

Com solucionar-ho?

És recomanable convertir container.size() al tipus d'enter per evitar errors de segmentació (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>

Sortida

Geeks For Geeks