PDA

View Full Version : [C++] Liste di oggetti C++


andreact88
13-04-2015, 16:34
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 :D

Simonex84
13-04-2015, 16:42
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.

andreact88
13-04-2015, 17:11
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.

71106
14-04-2015, 10:32
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 :D

Usa deque (http://en.cppreference.com/w/cpp/container/deque).

Esempio di dichiarazione:


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;


Initializzazione:


deque<Object> List{
Object(-10, false),
Object(3, true),
Object(40, true),
// ...
};


Inserimento:


List.push_front(Object(-3, true)); // in testa
List.push_back(Object(1, false)); // in coda


Iterazione:


for (auto it = List.begin(); it != List.end(); ++it) {
cout << it->m_Field1 << ' ' << it->m_Field2 << endl;
}


Iterazione con Boost Lambda (http://www.boost.org/doc/libs/1_57_0/doc/html/lambda.html):


for_each(List.begin(), List.end(),
cout << _1->m_Field1 << ' ' << _1->m_Field2 << '\n');
cout << flush;

71106
14-04-2015, 10:43
Pardon, ho suggerito il container sbagliato. :asd:

Credevo che deque fosse una lista doppiamente linkata mentre invece è un accrocchio strampalato basato su una specie di hash table.

Usa list (http://en.cppreference.com/w/cpp/container/list), gli snippet di cui sopra sono più o meno validi per tutti i container STL e quindi restano sostanzialmente invariati.

Esempio di dichiarazione:


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;


Initializzazione:


list<Object> List{
Object(-10, false),
Object(3, true),
Object(40, true),
// ...
};


Inserimento:


List.push_front(Object(-3, true)); // in testa
List.push_back(Object(1, false)); // in coda


Iterazione:


for (auto it = List.begin(); it != List.end(); ++it) {
cout << it->m_Field1 << ' ' << it->m_Field2 << endl;
}


Iterazione con Boost Lambda (http://www.boost.org/doc/libs/1_57_0/doc/html/lambda.html):


for_each(List.begin(), List.end(),
cout << _1->m_Field1 << ' ' << _1->m_Field2 << '\n');
cout << flush;

71106
14-04-2015, 10:46
P.s. Non posso utilizzare <vector> o <list> in quanto il mio professore vuole che il tutto venga svolto senza questi ultimi. Ah, ecco. :asd:

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?

71106
14-04-2015, 10:50
[...] invece la fine la trovi quando un elemento punta a NULL. Per cortesia, siamo nel 2015. :)

La fine la trovi quando un elemento punta a nullptr (http://en.cppreference.com/w/cpp/language/nullptr), non a NULL.

Simonex84
14-04-2015, 10:51
Per cortesia, siamo nel 2015. :)

La fine la trovi quando un elemento punta a nullptr (http://en.cppreference.com/w/cpp/language/nullptr), non a NULL.

evabbhe cambia poco, poi il C lo uso poco, lavoro da 7 anni con ADA

71106
14-04-2015, 10:55
evabbhe cambia poco, usare NULL è come usare gcc: nefasta inerzia tecnologia, nonchè cattiva programmazione. Se fosse "cambiato poco" non avrebbero introdotto nullptr.


poi il C lo uso poco, lavoro da 7 anni con ADA Ignorantia legis non excusat. :asd:

E comunque nullptr non è presente in C, solo in C++.

Simonex84
14-04-2015, 11:01
usare NULL è come usare gcc: nefasta inerzia tecnologia, nonchè cattiva programmazione. Se fosse "cambiato poco" non avrebbero introdotto nullptr.


Ignorantia legis non excusat. :asd:

E comunque nullptr non è presente in C, solo in C++.

ecco appunto, C++ non lo uso da informatica 1 e 2 seguiti nel 2003/2004, al lavoro quelle rare volte che non tratto codice ADA uso il C (senza i + :D)

Non è ignoranza ma scarsa memoria su cose che non uso mai

71106
14-04-2015, 11:10
Non è ignoranza ma scarsa memoria su cose che non uso mai Tieni presente che nullptr non c'era nel 2003/2004...

Simonex84
14-04-2015, 11:12
Tieni presente che nullptr non c'era nel 2003/2004...

sarà mica il caso che mi faccia un bel ripasso di C++ :D

andreact88
20-04-2015, 15:37
Vi ringrazio ragazzi per le risposte, il professore alla fine si è convinto a far utilizzare list e vector :D
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è:
lista.push_front(classe(valore));
Volevo utilizzare qualcosa del genere:
lista.push_front(classe e funzione add valori)

[Kendall]
20-04-2015, 17:56
Vi ringrazio ragazzi per le risposte, il professore alla fine si è convinto a far utilizzare list e vector :D
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è:
lista.push_front(classe(valore));
Volevo utilizzare qualcosa del genere:
lista.push_front(classe e funzione add valori)

Non ho ben capito cosa intendi per "funzione per l'inserimento dei valori".