STL - Vector

Dal terzo capitolo di Designing Components with the C++ STL, di Ulrich Breymann, dedicato ai container.

Vediamo un esempio di uso di vettori.

Creiamo un vettore di interi specificandone la dimensione. Se non si specifica il valore con cui vogliamo inizializzarlo, si usa zero come default.

Usiamo il metodo size() per reperire la dimensione del vettore; aggiungiamo un elemento con insert(), incrementando la dimensione del vettore; scandiamo il vettore usando un iteratore; infine scambiamo il contenuto di due vettori usando swap().

#include<vector>
#include<iostream>
using namespace std;

int main() {
vector<int> vectA(10);

cout << "A vector of int is initialized with 0" << endl;
for (size_t i = 0; i < vectA.size(); ++i)
cout << vectA[i] << ' ';
cout << endl;

// fill vector, random access
for (size_t i = 0; i < vectA.size(); ++i)
vectA[i] = i;

// vector increases on demand, append the number 100
vectA.insert(vectA.end(), 100);

// use as array
for (size_t i = 0; i < vectA.size(); ++i)
cout << vectA[i] << ' ';
cout << endl;

for (vector<int>::iterator it = vectA.begin(); it != vectA.end(); ++it)
cout << *it << ' ';
cout << endl;

vector<int> vectB(20);
cout << "\nvectB = ";
for (size_t i = 0; i < vectB.size(); ++i)
cout << vectB[i] << ' ';
cout << endl;

// swap(): a very fast method for swapping two vectors.
vectB.swap(vectA);
cout << "\nvectB after swapping = ";
for (size_t i = 0; i < vectB.size(); ++i)
cout << vectB[i] << ' ';
cout << "\n\nvectA = ";
for (size_t i = 0; i < vectA.size(); ++i)
cout << vectA[i] << ' ';
cout << endl;
}

Un altro esempio con un vettore di stringhe. Non specificando il valore da copiare, si usa come default la stringa vuota. Vediamo poi come insert() e erase() cambino la dimensione del vettore. Finiamo iterando a rovescio sul vettore.

#include<vector>
#include<iostream>
#include<string>

using namespace std;

int main() {
vector<string> vect(4);

cout << "A string vector is initialized with empty strings: ";
for (size_t i = 0; i < vect.size(); ++i)
cout << '"' << vect[i] << "\" ";
cout << endl;

vect[0] = "First";
vect[1] = "Second";
vect[2] = "Third";
vect[3] = "Fourth";

cout << "Setting values: ";
for (size_t i = 0; i < vect.size(); ++i)
cout << '"' << vect[i] << "\" ";
cout << endl;

vect.insert(vect.end(), "Last");
cout << "Inserting increases the size: " << vect.size() << endl;

vector<string>::iterator it = ++vect.begin();
cout << "Erasing the element next to begin: " << *it << endl;
vect.erase(it);

cout << "Inserting reduces the size: " << vect.size() << endl;
for (it = vect.begin(); it != vect.end(); ++it)
cout << '"' << *it << "\" ";
cout << endl;

cout << "Iterating backwards: ";
typedef vector<string>::reverse_iterator rev_it;
for (rev_it rit = vect.rbegin(); rit != vect.rend(); ++rit)
cout << '"' << *rit << "\" ";
cout << endl;
}

Si noti che il costo di una inserizione o rimozione alla fine del vettore ha costo costante, O(1), altrimenti bisogna tener conto che gli indici devono essere riallineati, causando un costo proporzionale al numero di elementi che devono essere spostati, O(n).

Nessun commento:

Posta un commento