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

    [c++ stl]storare dati

    Ciao.
    Ho 2 domande:

    1)ho un insieme di dati che devono venire memorizzati mano a mano senza sapere all'inizio di quanti elementi è composto l'insieme, niente mfc , in stl cosa posso usare?dovrei anche poter sostituire un valore ad es alla posizione 2 con un altro valore diverso ,cestinando il vecchio valore.
    E' possibile sapere se un elemento è già contenuto nell'insieme?
    2)esiste il dizionario o hashtable in stl c++


    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    1) std::vector, std::deque, std::list, std::map (a volte). Sono container autoincrementanti per lo storage dei dati. Le prestazioni dipende da quello che devi fare. Per accessi random (in stile array C, lo std::vector è indicato, ma superata una certa dimensione si autodimensione copiando per valore il contenuto in un nuovo buffer.
    la std::list invece consente solo accessi sequenziali, quindi se devi accedere ad un elemento in mezzo ai due estremi ci mette di più, ma ha il vantaggio di non riallocarsi in automatico. La std::deque è una via di mezzo.

    2) Non mi sembra che lo standard preveda hashtable. So che la Stl di SGI ne preveda una però, ma non l'ho mai usata.
    Però con la std::map, puoi usare delle stringhe come chiave.

  3. #3

    Re: [c++ stl]storare dati

    Originariamente inviato da giuseppe500
    Ciao.
    Ho 2 domande:

    1)ho un insieme di dati che devono venire memorizzati a mano a manosenza sapere all'inizio di quanti elementi è composto l'insieme, niente mfc , in stl cosa posso usare?
    una lista?
    Sì, la classe list può andare, ma dipende anche dagli altri vincoli che hai; forse è meglio se ce li dici.
    E' possibile sapere se un elemento è già contenuto nell'insieme?
    Sì, è possibile ma non è estremamente efficiente (devi usare l'algoritmo find, che nel caso della lista deve controllare la lista dall'inizio alla fine); se ti serve un contenitore che contenga solo elementi unici ti può convenire usare la classe set.
    2)esiste il dizionario o hashtable in stl c++
    Sì, c'è la classe map (o multimap, se ad una chiave possono corrispondere più valori); se non ti serve che i valori siano ordinati molti compilatori recenti forniscono anche la classe unordered_map (prevista dal prossimo standard C++).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    1)ho necessità di inserire un oggetto con chiave alcuni parametri e di farmi restituire l'oggetto inserito con chiave gli stessi parametri.
    2)se una chiave non ha una corrispondenza devo avere qualcosa che me lo dice(chesso un NULL di ritorno .

    potrebbe andare il set penso , ma per molti parametri?
    come funziona il multiset che non lho capito?

  5. #5
    Set è un insieme senza ripetizioni, multiset con ripetizioni ....
    In set e in multiset non si accede agli elementi mediante chiave ...
    http://www.cplusplus.com/reference/stl/map/

    Puoi usare anche un tipo di dato astratto per contenere i parametri
    Experience is what you get when you don’t get what you want

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie.
    Pero' non ho ben capito come utilizzare piu' di una chiave , ad es
    vorrei accedere all' elemento che ha "1" come prima chiave e "2" come seconda chiave.
    Potrei unire le due chiavi in un unica chiave "00000001" e "2" sciftato di un offset diciamo di 10000, la chiave diventerebbe:

    "1" e "2":
    "00020001"

    "2" e "3"
    "00030002"

    e con una semplice funzione fare questa trasformazione,ma chiedevo se c'è qualcosa di un po piu' elegante.e soprattutto di gia pensato.
    vuoi che non ci abbia pensato nessuno

  7. #7
    ma scrivi un po' potabile !
    All'inizio ti serviva una cosa, a metà te ne serviva un'altra e ora te ne serve un'altra ancora...
    Tra l'altro o tu ti spieghi male o io continio a non capire:
    spiega chiaramente quello che ti serve e ti sarà dato supporto.
    Experience is what you get when you don’t get what you want

  8. #8
    Usa come chiave un std:air<int, int>.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Originariamente inviato da Xaratroom
    ma scrivi un po' potabile !
    All'inizio ti serviva una cosa, a metà te ne serviva un'altra e ora te ne serve un'altra ancora...
    Tra l'altro o tu ti spieghi male o io continio a non capire:
    spiega chiaramente quello che ti serve e ti sarà dato supporto.
    scusate , cerco di spiegarmi meglio.

    Ho una struttura Vertex con varie proprietà(Normale,x,y,z ecc..)
    Devo duplicare un vertice se non è presente nella collezione e aggiungerlo altrimenti non fare niente se è gia' presente.
    Il problema è che un vertice ha varie proprietà come dicevo e l'essere "presente" o meno nella collezione dipende da questo.
    In pratica se tutte le proprietà tra il vertice che sto processando e quelle un oggetto della collezione sono uguali allora il vertice è presente altrimenti no.

    Le proprietà sono piu' di 2 per questo non posso usare pair ma qualcos altro.
    per adesso sarebbero NormaleX,NormaleY e NormaleZ ma potrebbero essere di piu'
    grazie.

  10. #10
    Usa un set, effettuando eventualmente l'overloading dell'operatore == in modo che il confronto di uguaglianza tra due elementi avvenga secondo i criteri stabiliti da te. Così facendo non devi nemmeno controllare manualmente se l'elemento è già inserito: infatti
    Because set containers do not allow for duplicate values, the insertion operation checks for each element inserted whether another element exists already in the container with the same value, if so, the element is not inserted and -if the function returns a value- an iterator to it is returned.
    (link).
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.