Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    [C++] enum, map, unordered_map

    Il problema e' rappresentare/associare ad ogni provincia una zona fra quattro disponibili.

    All'inizio pensavo di fare cosi', sfruttando solo enum:
    codice:
    enum Zona: unsigned int
    {
      zona1_a,
      zona1_b,
      zona2,
      zona3
    };
    enum Provincia: unsigned int
    {
      Sondrio=Zona::zona1_a,
      Milano=Zona::zona1_b,
      Bari=Zona::zona2,
      Roma=Zona::zona3
      //altre
    };
    col problema che:
    • non posso associare direttamente alla stringa della provincia il termine dell'enum Provincia, nel senso che non posso usare la variabile std::string prov per effettuare la ricerca per ricavare a che zona appartiene senza passaggi ulteriori;
    • il ciclo switch di ricerca diventa "infinito" da scrivere.


    Ho sentito parlare, ma non ho mai studiato / usato le map / unordered_map del C++, che pero' potrebbero fare al caso mio.

    Pensavo di poter fare cosi'

    codice:
    enum Zona: unsigned int
    {
      zona1_a,
      zona1_b,
      zona2,
      zona3
    };
    std::unordered_map<std::string,Zona> mymap =
    {
      {"Sondrio",Zona::zona1_a},
      {"Milano",Zona::zona1_b},
      {"Bari",Zona::zona2},
      {"Roma",Zona::zona3}
      //altre
    };
    in quanto poi potrei ricavare la zona di appartenenza per le successive operazioni in questo modo

    codice:
    std::string prov = "Milano";
    Zona zona = mymap.at(prov);
    Ho dato un occhio, anzi, anche due, alla documentazione ufficiale, e alle discussioni gia' presenti nel forum ( http://forum.html.it/forum/search.php?searchid=3592520 ), ma non riesco a capire:
    • se effettivamente map/unordered map puo' essere utile in questo caso;
    • se lo e', meglio map o unordered_map? Io pensavo unoredered_map, in quanto i miei dati non hanno un ordine particolare da rispettare;
    • se non lo e', cosa puo' esserlo? Altri container della STL, ma sinceramente non ne vedo altri...


    Grazie
    Ultima modifica di ing82; 12-10-2016 a 22:56 Motivo: aggiunto nel titolo il linguaggio

  2. #2
    La provincia in questione è un dato che ottieni "da fuori" del programma come stringa?

    In ogni caso, sì, le mappe servono proprio a questo - legare una "chiave" complicata a un qualche valore. La differenza tra una map e una unordered_map è che la prima è sostanzialmente un RB tree (inserimento/cancellazione/ricerca in O(log n), tipicamente ogni valore su un nodo per i fatti suoi => pattern di allocazione non sempre ottimale, sequenza sempre ordinata in base alla chiave, necessario un operatore di confronto tra le chiavi), la seconda una hash table (ricerca e cancellazione in O(1), inserimento in O(1) ammortizzato, buona località, sequenza ordinata in un ordine non deterministico - dipende dalla funzione di hash, necessaria una buona funzione di hash per le chiavi). Nota importante, per unordered_map serve C++11.

    In linea di massima, se non ti serve che la sequenza sia ordinata per chiavi, la unordered_map ha solitamente caratteristiche di performance migliori, anche se per tabelle di lookup "fissate" un normale vettore ordinato con ricerca dicotomica può essere una buona concorrente (e se le chiavi sono interi in sequenza una tabella di lookup "secca" è ancora meglio).

    In ogni caso, se ci sono così poche chiavi qualunque cosa va bene.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    La provincia in questione è un dato che ottieni "da fuori" del programma come stringa?
    La struttura dati e' fissa, nel senso che l'associazione provincia-zona e' prefissata.

    L'unica interazione che ci puo' essere con l'utente e' che per un valore di provincia da lui immesso, dovra' essere ricavato il rispettivo valore della zona.

    L'associazione provincia-zona e' un dato prefissato, che l'utente deve prendersi cosi' com'e', senza possibilita' di interazione.

    Con una situazione simile, mi chiedevo quindi se l'uso di map non sia solo uno spreco.

    Avro' all'incirca altre tre o quattro strutture simili, anche come numero di elementi, ma non riesco a capire cosa conviene implementare.

    Il 'funzionamento' e' all'incirca: apro il programma per eseguire le operazioni che sono legate a quel sito, che quindi sta in una e una sola provincia, che una volta immessa, non cambia piu', faccio quello che devo fare, termina il programma.
    Mi vengono in mente due soluzioni alternative:


    1. potrei appoggiarmi anche ad un file di testo, dato che l'accesso alla struttura dati potrei definirlo 'piu' unico che raro';
    2. creo una funzione in cui map viene creato come oggetto temporaneo.


    Per quanto riguarda il vettore con ricerca dicotomica, devo studiare cosa significa, in quanto sono ignorante (programmo per necessita' e da autodidatta), cosi' come per le altre indicazioni, studiero' cosa significano...

    Grazie
    Ultima modifica di ing82; 13-10-2016 a 22:39

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.