Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Assegnamento valore: overload di due operatori
Forum - C/C++ - Assegnamento valore: overload di due operatori

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 19:40
Mercoledì, 06/01/2016
Buongiorno e auguri a tutti.

Sto scrivendo una classe per gli array associativi in C++.
Per ora un elemento si aggiunge chiamando la funzione Insert, ma voglio dare la possibilità di poter fare:

AssociativeArray<int> array;
array["indice"] = 7;

C'è un "problema" l'overload dell'operatore [] serve già per ottenere il valore in quel dato indice.
La classe per il momemnto è così:
Codice sorgente - presumibilmente C++

  1. template <class T>
  2.                 class AssociativeArray
  3.                 {
  4.                 public:
  5.                         AssociativeArray();
  6.                         ~AssociativeArray();
  7.                         size_t Size();
  8.                         T& operator [] (string name);
  9.                         bool Contains(string name);
  10.                         void Insert(string index, T value);
  11.                         void Remove(string index);
  12.  
  13.                 private:
  14.                         struct _Data
  15.                         {
  16.                                 T data;
  17.                                 string name;
  18.                         };
  19.                         unique_ptr<vector<_Data>> array = unique_ptr<vector<_Data>>(nullptr);
  20.                 };



Ciò che chiedo è possibile? Se si come si fa (qual'è la firma della funzione)?

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 15:34
Venerdì, 08/01/2016
Leggi come funziona operator[] in std::map http://www.cplusplus.com/reference/map/map/operator%5B%5D/

Tra l'altro, perché non usi std::map?

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 15:53
Venerdì, 08/01/2016
Perchè sto parzialmente "riscrivendo"/"rimpiazzando" la STL.
Motivi vari e disparati (e probabilmente anche disperati :rotfl::rotfl::rotfl::rotfl: ), ma è un esperimento/progetto carino.....
Il progetto fa parte di una libreria molto..... "H:ot:" :rotfl::rotfl::rotfl::rotfl::rotfl::rotfl:
Comunque grazie!

"If k matches the key of an element in the container, the function returns a reference to its mapped value.

If k does not match the key of any element in the container, the function inserts a new element with that key and returns a reference to its mapped value. Notice that this always increases the container size by one, even if no mapped value is assigned to the element (the element is constructed using its default constructor)." E' geniale :hail::hail::hail: come ho fatto  non pensarci???

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 16:15
Venerdì, 08/01/2016
Ok ma prima di scrivere una libreria impara quando usare i const reference per il passaggio dei parametri.
Tra l'altro per una struttura associativa una linked list è un harakiri prestazionale.

Io sinceramente trovo bruttino il comportamento di operator[], preferisco il metodo at() e inserire con insert

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 17:19
Venerdì, 08/01/2016
Testo quotato

Postato originariamente da lumo:

Ok ma prima di scrivere una libreria impara quando usare i const reference per il passaggio dei parametri.
Tra l'altro per una struttura associativa una linked list è un harakiri prestazionale.

Io sinceramente trovo bruttino il comportamento di operator[], preferisco il metodo at() e inserire con insert



Beh, per non sbagliare è già possibile usare entrambi i metodi.....

Sono d'accordo sul punto che usare un vettore è una stupidaggine.... Consigli di usare una struttura a stack? Così da favorire gli accessi agli ultimi dati inseriti? Posso guadagnare prestazioni separando gli stack per lettera iniziale? Ne vale la pena?
Che altre strutture potrei usare? Ora non mi viene in mente nulla......

Volendo potrei anche usare un database sqlite in memoria per memorizzare i dati.... E' fattibile ma non penso porterà alcun beneficio :rotfl::rotfl:

Ultima modifica effettuata da TheDarkJuster il 08/01/2016 alle 17:21
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 18:21
Venerdì, 08/01/2016
La butto lì, forse è una cretinata ma non si sa mai... una tabella di simboli che converta gli indici alfabetici (gli array associativi li prevedono, giusto?) in analoghi numerici tramite l'opportuna funzione di hashing? :D

Certo, se volessi utilizzare istruzioni del tipo

Codice sorgente - presumibilmente Plain Text

  1. mioarray[1] = qualcosa;
  2. ...
  3. mioarray["stringa"] = qualchealtracosa;



Magari la funzione di hashing potrebbe creare collisioni, ma se fossero utilizzati come reciproche alternative potrebbe andar bene ;)


Ho avuto quest'idea per associazione: di fatto quanto hai citato circa le std:map

Testo quotato


"If k matches the key of an element in the container, the function returns a reference to its mapped value.

If k does not match the key of any element in the container, the function inserts a new element with that key and returns a reference to its mapped value. Notice that this always increases the container size by one, even if no mapped value is assigned to the element (the element is constructed using its default constructor)."



È esattamente ciò che si fa con le tabelle di simboli per registrare i nodi di un grafo (o almeno, ciò che vari autori - al momento mi viene in mente Sedgewick, ma credo lo faccia pure Cormen - propongono di fare) :D

Ultima modifica effettuata da Template il 08/01/2016 alle 18:22
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 19:44
Venerdì, 08/01/2016
Per strutture come map si usano in genere alberi di ricerca bilanciati, come gli AVL tree o i red-black tree.
In alternativa potresti usare un'hashtable visto che nella tua classe le chiavi sono stringhe (= non è troppo difficile creare una funzione di hashing)

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:36
Venerdì, 08/01/2016
Va bene, andata per la ricerca tramite hashing! Se le prestazioni non mi comodano posso sempre cambiare il motore, ma un tentativo con codice più semplice va fatto :D
Dovrei usare un algoritmo di hashing particolarmente veloce (opzione che sceglierei) o uno con un basso numero di collisioni (magari più lento, opzione che scarterei)?

C'è qualcosa che non ho considerato e che, invece, dovrei rivedere?

P.S. tanto strutture ad albero dovrò comunque utilizzarne, visto che prevedo di implementare un algoritmo di compressione dati .....

Ultima modifica effettuata da TheDarkJuster il 08/01/2016 alle 20:39
PM Quote
Avatar
Template (Member)
Pro


Messaggi: 177
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 1:39
Sabato, 09/01/2016
Se, come credo, le inserzioni saranno importanti e frequenti, forse conviene tendere più verso la velocità (fermo restando che un algoritmo particolarmente sensibile al clustering potrà anche essere teoricamente velocissimo, ma con certe concentrazioni di dati risulterà comunque sconveniente)... anche se, chiaramente (sviluppo una riflessione puramente generale), qualsiasi algoritmo risulta di per sè ininfluente a livello di prestazioni se non è inserito in una struttura a sua volta efficientemente congegnata, e viceversa una struttura ben congegnata può spostare gli equilibri del programma sì da rendere utilizzabili algoritmi che, considerati individualmente, potrebbero non apparire particolarmente convenienti.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo