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 / Tipo | Descrizione |
|---|---|
std::declval | Usato nei metaprogrammi per "simulare" oggetti |
std::rel_ops | Crea operatori di confronto automaticamente |
std::exchange | Scambia un valore e restituisce quello vecchio |
std::integer_sequence | Sequenza di numeri interi per template |
std::index_sequence | Indice 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.
Strumenti:
- pair e make_pair
- swap
- move
- forward
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().