|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Aug 2011
Messaggi: 19
|
[C++] Liste di oggetti C++
Ciao a tutti, sono alle prese con le liste di oggetti in c++, purtroppo non ho ben chiaro il funzionamento. Qualcuno saprebbe spiegarmi come poterle fare?
Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2003
Messaggi: 15829
|
una lista è una sequenza di oggetti che contengono dei dati e l'indirizzo dell'elemento successivo (fatto nello stesso modo)
quindi ci devono essere almeno due campi un puntatore e un contenuto, bisogna sempre salvara da qualche parte l'indirizzo dell'elemento inziale, invece la fine la trovi quando un elemento punta a NULL. Questa è una descrizione a grandi linee di cos'è una lista. Il grosso vantaggio della lista è che puoi aggiungere elementi dinamicamente quindi per esempio potresti usarla per salvare una lista di interi, tipo vettore, del quale non conosci a priori la lunghezza. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Aug 2011
Messaggi: 19
|
Intanto ti ringrazio per la risposta.
Credo che la mia domanda fosse un po' troppo vaga. Io riesco tranquillamente a creare una lista, accedervi aggiungendo ed eliminando elementi. Il mio problema nasce nel momento in cui la lista debba essere di oggetti. Anziché passare un "data" di tipo int, vorrei passare un oggetto. Per esempio, vorrei creare una rubrica. Dunque la mia lista dovrà contenere un'insieme di persone. Supponendo di avere già una classe "Persone" con metodi e tutto, come faccio ad inserire un tot di persone ( questo tot non definito, chiaramente, sennò avrei optato per gli array )? Spero di essere stato chiaro. P.s. Non posso utilizzare <vector> o <list> in quanto il mio professore vuole che il tutto venga svolto senza questi ultimi. |
|
|
|
|
|
#4 | |
|
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Quote:
Esempio di dichiarazione: Codice:
struct Object {
int m_Field1;
bool m_Field2;
Object(int const a_Field1, bool const a_Field2) :
m_Field1(a_Field1),
m_Field2(a_Field2) {}
};
deque<Object> List;
Codice:
deque<Object> List{
Object(-10, false),
Object(3, true),
Object(40, true),
// ...
};
Codice:
List.push_front(Object(-3, true)); // in testa List.push_back(Object(1, false)); // in coda Codice:
for (auto it = List.begin(); it != List.end(); ++it) {
cout << it->m_Field1 << ' ' << it->m_Field2 << endl;
}
Codice:
for_each(List.begin(), List.end(), cout << _1->m_Field1 << ' ' << _1->m_Field2 << '\n'); cout << flush; |
|
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Pardon, ho suggerito il container sbagliato.
![]() Credevo che deque fosse una lista doppiamente linkata mentre invece è un accrocchio strampalato basato su una specie di hash table. Usa list, gli snippet di cui sopra sono più o meno validi per tutti i container STL e quindi restano sostanzialmente invariati. Esempio di dichiarazione: Codice:
struct Object {
int m_Field1;
bool m_Field2;
Object(int const a_Field1, bool const a_Field2) :
m_Field1(a_Field1),
m_Field2(a_Field2) {}
};
list<Object> List;
Codice:
list<Object> List{
Object(-10, false),
Object(3, true),
Object(40, true),
// ...
};
Codice:
List.push_front(Object(-3, true)); // in testa List.push_back(Object(1, false)); // in coda Codice:
for (auto it = List.begin(); it != List.end(); ++it) {
cout << it->m_Field1 << ' ' << it->m_Field2 << endl;
}
Codice:
for_each(List.begin(), List.end(), cout << _1->m_Field1 << ' ' << _1->m_Field2 << '\n'); cout << flush; |
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Quote:
![]() Il tuo professore è un idiota, se svolgessi il compito correttamente finiresti per riscrivere un container STL, cosa che non penso tu sia in grado di fare. Non perchè tu sia stupido, ma perchè dubito che il tuo professore sia entrato così a fondo in certi argomenti relativi al linguaggio C++. Esempio: vi ha mai parlato di R-value references e move semantics? |
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
usare NULL è come usare gcc: nefasta inerzia tecnologia, nonchè cattiva programmazione. Se fosse "cambiato poco" non avrebbero introdotto nullptr.
Quote:
![]() E comunque nullptr non è presente in C, solo in C++. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jun 2003
Messaggi: 15829
|
Quote:
Non è ignoranza ma scarsa memoria su cose che non uso mai |
|
|
|
|
|
|
#11 |
|
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2003
Messaggi: 15829
|
|
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Aug 2011
Messaggi: 19
|
Vi ringrazio ragazzi per le risposte, il professore alla fine si è convinto a far utilizzare list e vector
Adesso ho un solo quesito, durante l'utilizzo della funzione push_front, io volevo passare anzichè dei parametri, una funzione per l'inserimento dei valori, è possibile farlo? Es. Anzichè: Codice:
lista.push_front(classe(valore)); Codice:
lista.push_front(classe e funzione add valori) Ultima modifica di andreact88 : 20-04-2015 alle 15:42. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:52.





















