Quando in C avevamo bisogno di di un array con lunghezza variabile dovevamo ricorrere all’allocazione dinamica, ricordandoci di allocare e deallocare la memoria. Lo stesso valeva per le liste, che dovevamo inoltre implementare da soli.
Fortunatamente C++ ci viene incontro, offrendoci le implementazioni di vettori e liste.
I vettori ci offrono array con dimensione variabile e relative funzioni di utility. Sono molto comodi da utilizzare e non hanno particolari drawback rispetto agli array.
Le funzioni di utility sono le seguenti:
begin(): ritorna un iteratore che punta al primo elemento
end(): ritorna un iteratore che punta all’ultimo elemento
size(): ritorna il numero di elementi presenti nel vettore
empty(): ritorna true se il vettore è vuoto
push_back(T): aggiunge un elemento alla fine del vettore
pop_back(): rimuove un elemento dall fine del vettore
insert(std::vector<T>::iterator, T): aggiunge l’elemento specificato nel secondo parametro alla posizione specificata dal primo
clear(): elimina tutti gli elementi dal vettore
#include <iostream>
#include <vector>
using namespace std;
int main() {
//Tra '<' e '>' metto il tipo del vettore
vector<int> vettore;
//Aggiungo 3 numeri alla fine del vettore
vettore.push_back(10);
vettore.push_back(20);
vettore.push_back(30);
//Stampo il primo elemento del vettore
cout << vettore[0] << endl;
//Elimino l'ultimo elemento dal vettore
vettore.pop_back();
//Inserisco 30 in seconda posizione
vettore.insert(vettore.begin() + 1, 30);
//Stampo il contenuto del vettore
for (int i = 0; i < vettore.size(); i++) {
cout << vettore[i] << " ";
}
cout << endl;
//Svuoto il vettore
vettore.clear();
//Verifico se il vettore è vuoto
cout << "vuoto = " << vettore.empty();
return 0;
}
La list di C++ implementa una lista a doppio collegamento con relative funzioni di utility. Inserimento e rimozione sono più performanti rispetto ai vettori, ma manca l’accesso casuale, dato che l’allocazione della memoria non è contigua.
Le funzioni di utility sono le seguenti:
begin(): ritorna un iteratore che punta al primo elemento
end(): ritorna un iteratore che punta all’ultimo elemento
size(): ritorna il numero di elementi presenti nella lista
empty(): ritorna true se la lista è vuota
push_front(T): aggiunge un elemento all’inizio della lista
push_back(T): aggiunge un elemento alla fine della lista
pop_front(): rimuove un elemento dall’inizio della lista
pop_back(): rimuove un elemento dalla fine della lista
insert(std::list<T>::iterator, T): aggiunge l’elemento specificato nel secondo parametro alla posizione specificata dal primo
clear(): elimina tutti gli elementi dalla lista
#include <iostream>
#include <list>
using namespace std;
int main() {
//Tra '<' e '>' metto il tipo della lista
list<int> lista;
//Aggiungo 1 numero all'inizio della lista
lista.push_front(10);
//Aggiungo 2 numeri alla fine della lista
lista.push_back(20);
lista.push_back(30);
//Stampo il primo elemento della lista
cout << lista.front() << endl;
//Stampo l'ultimo elemento della lista
cout << lista.back() << endl;
//Elimino il primo elemento dalla lista
lista.pop_front();
//Elimino l'ultimo elemento dalla lista
lista.pop_back();
//Inserisco 30 all'inizio della lista
lista.insert(lista.begin(), 30);
//Stampo il contenuto della lista
for (list<int>::iterator i = lista.begin(); i != lista.end(); i++) {
cout << *i << " ";
}
cout << endl;
//Svuoto la lista
lista.clear();
//Verifico se la lista è vuota
cout << "vuoto = " << lista.empty();
return 0;
}