Vettori e Liste in C++

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.

Vettori

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

Liste

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