Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++ stl] map e find personalizzato

    ciao.
    So che per cambiare l'ordinamento dei key di una mappa basta fare l'override della funzione < della loro classe in stl.
    Il problema è che vorrei creare un map.find() personalizzato di una classe key, basta fare l'override dell' operatore == ?
    o sbaglio?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Della classe Key però.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    si, hai ragione.
    ciao.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    un altra domanda ,shodan:
    se faccio l'override della funzione < and es .
    con i seguenti paramentri:

    operator <(const Cmaterial& mat1, const Cmaterial& mat2)

    e ho una mappa del tipo map<Cmaterial, int> mappa
    funziona , tutto va come dovrebbe andare .

    ma se uso i puntatori e piazzo un break point nella funzione < non capisco perchè non entra .

    vorrei utilizzare una mappa del tipo :
    map<Cmaterial*, int> mappa.

    Un ultima cosa , se uso degli smart pointer nella mappa ?
    dipende dagli smart pointer credo , ad es gli smart pointer shared_pointer di boost e del ::tr1 come si comportano?

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Perché i puntatori non sono oggetti, pertanto il tuo operatore di confronto passa in secondo piano rispetto a quello naturale, implicito tra raw pointer.
    Se utilizzi shared_pointer la faccenda cambia, ma non molto. Gli shared_pointer definiscono un loro operatore di confronto, ma ciò che fa questo operatore è un confronto tra i raw pointer memorizzati. Se il tuo scopo è confrontare due CMaterial devi dereferenziare i puntatori (meglio se di classe shared_ptr) all'interno dell'operatore < .

    codice:
    bool operator <(const shared_ptr<Cmateria>l& mat1, const shared_ptr<Cmaterial>& mat2) {
        return ( *mat1 < *mat2);
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Grazie Shodan ma purtroppo non ho capito le basi che stanno dietro al weak order strict e scrivo codice a caso , e questo non va! , ho letto su wikipedia e su google , ma non ho le idee chiare.
    Quello che non ho capito è come il ritorno true / false del predicato possa creare un ordine , e quante volte viene chiamata la funzione <?
    per tutti le chiavi nella mappa?
    ha qualcosa a che fare con gli alberi binari?
    e invece l' ==?

    se sei cosi gentile da consigliarmi un capitolo di qualche libro o qualcosa piu' che un tutorial , per capire effettivamente ,ti ringrazio di cuore.

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Scusa, ma ti è mai capitato di ordinare qualcosa? Che so, un mazzo di carte, documenti o altro? In quel caso come procedi? Non stabilisci un criterio arbitrario per stabilire come ordinare? Ad esempio peschi una carta e dici: tutte le carte minori di questa in mano, vanno a sinistra; le maggiori di questa vanno a destra (o viceversa?)

    Lo stesso principio si applica in informatica (con algoritmi più o meno efficienti), indipendentemente che siano liste, array, mappe, b-tree o quant'altro.

    Per rispondere alle domande:
    1) la funzione < è invocata sempre sia in fase di inserimento sia fase di ricerca.
    2) vedi su
    3) Un libro che parli di algoritmi e strutture dati, anche se in genere sono scritti in presudo linguaggio.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.