Linguaggio C++

Libreria Utility

Introduzione alla libreria utility del C++: pair, move, forward, swap, relazioni e funzioni utilitarie della STL.

La libreria <utility> contiene una serie di strumenti di supporto fondamentali per la programmazione moderna in C++. Include:

  • std::pair — una coppia di valori
  • std::swap — scambia due variabili
  • std::move — move semantic
  • std::forward — perfect forwarding
  • funzioni per confronti e operazioni generiche

È una libreria molto utilizzata da tutte le altre componenti della STL.


1️⃣ Inclusione della libreria


#include <utility>
using namespace std;

2️⃣ std::pair

Una coppia di valori eterogenei.


pair persona("Mario", 30);

cout << persona.first;   // Mario
cout << persona.second;  // 30
Creazione con make_pair()

auto p = make_pair("Roma", 1200000);

3️⃣ std::swap

Scambia i contenuti di due variabili.


int a = 10, b = 20;
swap(a, b);

4️⃣ std::move

Converte un valore in un rvalue per abilitarne lo spostamento (move semantics).


string s1 = "ciao";
string s2 = move(s1);

cout << s2;  // "ciao"
cout << s1;  // stringa vuota
Attenzione: dopo move(), l oggetto sorgente è in stato valido ma non definito.

5️⃣ std::forward

Usato nei template per il perfect forwarding.


template <typename T>
void wrapper(T&& x) {
    funzione(std::forward(x));
}

6️⃣ Altri strumenti della libreria

Funzione / TipoDescrizione
std::declvalUsato nei metaprogrammi per "simulare" oggetti
std::rel_opsCrea operatori di confronto automaticamente
std::exchangeScambia un valore e restituisce quello vecchio
std::integer_sequenceSequenza di numeri interi per template
std::index_sequenceIndice automatici per tuple e pack

7️⃣ Esempio: uso avanzato di pair


vector> studenti = {
    {"Luca", 28},
    {"Anna", 30},
    {"Marco", 27}
};

for(auto& s : studenti)
    cout << s.first << " ha " << s.second << " anni\n";

8️⃣ Esempio: std::exchange


int x = 10;
int y = exchange(x, 99);

cout << x; // 99
cout << y; // 10

9️⃣ Esempio completo


pair prodotto("Mouse", 19.99);

swap(prodotto.first, prodotto.second);  // errore → tipi diversi

// std::move example
string a = "uno";
string b = move(a);

cout << a; // vuota
cout << b; // uno
LABORATORIO

Strumenti Utili della Libreria utility

In questo laboratorio imparerai a usare pair, swap, move e altri strumenti della libreria <utility> per scrivere codice più compatto, sicuro e moderno.


1 Creare una coppia di valori


pair p("Mario", 22);

cout << p.first << ", " << p.second;

2 Usare make_pair


auto città = make_pair("Milano", 1400000);

3 swap tra due variabili


int a = 5, b = 9;
swap(a, b);

4 move semantic


string x = "test";
string y = move(x);

cout << y; // test

5 Esercizi

  • Crea un vector di pair <string,int> per memorizzare studenti e voti.
  • Usa swap() per invertire i valori di due variabili.
  • Usa move() su una stringa e verifica lo stato della stringa originaria.
  • Implementa una piccola funzione template che usa forward().