Utilizzo di array associativi

C++:
Utilizzo di array associativi

Come fare:

In C++, gli array associativi prendono vita con gli header <map> e <unordered_map>. Spezziamo in esempi per vedere entrambi in azione.

Usare std::map

std::map mantiene gli elementi ordinati in base alla chiave. Ecco come iniziare:

#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, int> ageMap;
    
    // Inserire valori
    ageMap["Alice"] = 30;
    ageMap["Bob"] = 25;
    
    // Accedere ai valori
    std::cout << "Età di Bob: " << ageMap["Bob"] << std::endl;
    
    // Iterare su una map
    for(const auto &pair : ageMap) {
        std::cout << pair.first << " ha " << pair.second << " anni." << std::endl;
    }
    
    return 0;
}

Usare std::unordered_map

Quando l’ordine non è importante, ma lo è la performance, std::unordered_map è il tuo amico, offrendo una complessità media più rapida per inserimenti, ricerche e cancellazioni.

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    std::unordered_map<std::string, double> productPrice;
    
    // Inserire valori
    productPrice["milk"] = 2.99;
    productPrice["bread"] = 1.99;
    
    // Accedere ai valori
    std::cout << "Prezzo del latte: $" << productPrice["milk"] << std::endl;
    
    // Iterare su una unordered_map
    for(const auto &pair : productPrice) {
        std::cout << pair.first << " costa $" << pair.second << std::endl;
    }
    
    return 0;
}

Approfondimento

Gli array associativi in C++, in particolare std::map e std::unordered_map, non sono solo per l’archiviazione degli elementi. Forniscono una base per una gestione dei dati più complessa permettendo operazioni come ricerca, inserimento e rimozione in tempi di complessità efficienti (logaritmici per std::map e tempo medio costante per std::unordered_map). Questa efficienza deriva dalle strutture di dati sottostanti: un albero bilanciato per std::map e una tabella hash per std::unordered_map.

Storicamente, prima che fossero parte della libreria standard, i programmatori dovevano implementare le proprie versioni o utilizzare librerie di terze parti, portando a inconsistenze e potenziali inefficienze. L’inclusione delle mappe nella libreria standard del C++ non solo ha standardizzato il loro uso, ma le ha anche ottimizzate per la performance attraverso diversi compilatori e piattaforme.

Sebbene entrambi siano potenti, la scelta tra un std::map e un std::unordered_map dipende dalle specificità del tuo caso d’uso. Hai bisogno di dati ordinati e non ti importa di un leggero compromesso sulla performance? Scegli std::map. Se cerchi velocità e l’ordine non ti interessa, std::unordered_map è probabilmente la scelta migliore.

Tuttavia, è importante notare che quando si lavora con strutture dati complesse, ci sono sempre dei compromessi. In alcuni casi di nicchia, altre strutture dati o persino librerie di terze parti potrebbero offrire prestazioni migliori o funzionalità adatte alle tue esigenze specifiche. Valuta sempre le tue opzioni in base ai requisiti del tuo progetto.