|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Nov 2007
Messaggi: 7
|
[C++] std::list passaggio parametri ad una funzione
Ho la necessità di passare ad una funzione una std:list, tale funzione ne modificherà il contenuto (in pratica legge dei dati da file e li inserisce in lista con delle push_back), al di fuori di quella funzione deve essere possibile ciclare sulla lista e vederne il contenuto. Essendo abituata a programmare in C mi verrebbe da creare un puntatore e passare quello alla funzione, poi in essa fare via via i miei inserimenti nella mia lista (usando una struct campo intero e next e modificando opportunamenteil campo next). Pensavo usando std::list di potermelo risparmiare e che questo potesse funzionare, dove sbaglio?
Codice:
readFile(list <int> L) { ... L.push_back(someInt); } void main (void) { list<int> L; readFile(L); for(list<int>::iterator ai=L.begin(); ai!=L.end(); ++ai) cout << *ai << endl; } ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Se hai programmato in C saprai che i parametri vengono passati per copia alle funzioni chiamate: ebbene, il C++ ti permette di evitare i puntatori passando i parametri per riferimento, se esplicitamente dichiarato. Ti basta aggiungere una & alla dichiarazione di prima per poterla usare come fosse una variabile locale e propagarne le modifiche anche alla funzione chiamante:
Codice:
void readFile(list<int> &L) { /* ... */ L.push_back(someInt); }
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
In alternativa puoi continuare a passare il valore per copia e ritornare la lista stessa:
Codice:
#include <iostream> #include <list> std::list<int> readFile(std::list<int> L) { for (int i = 0; i < 10; i++) L.push_back(i + 1); return L; }; int main () { std::list<int> L; L = readFile(L); for(std::list<int>::iterator ai = L.begin(); ai != L.end(); ai++) std::cout << *ai << std::endl; return 0; } Ciao |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]() Per una funzione dove ci si aspetta che venga modificato qualcosa è meglio passare direttamente il riferimento, altrimenti devono essere effettuate due copie quando si potrebbero benissimo evitare. ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Aug 2008
Messaggi: 51
|
Be si era un discorso piu' generale, nel caso in cui non si volesse fare uso di riferimenti o puntatori.
|
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: Nov 2007
Messaggi: 7
|
Grazie 1000, si avevo omesso il void per brevità, in realtà la funzione è più complessa e già di suo ritorna un valore (sostanzialmente se la lettura da file è andata a buon fine e se ha riempito correttamente la lista), il dubbio che avevo, non avendo mai usato list, è se fosse in modo "implicito" un puntatore, quindi è sufficiente aggiungere una & alla dichiarazione per passare i parametri come riferimento, e richiamare la funzione così?
Codice:
void readFile(list<int> &L) { /* ... */ L.push_back(someInt); } int main () { ist<int> L; L = readFile(L); for(list<int>::iterator ai = L.begin(); ai != L.end(); ai++) cout << *ai << endl; return 0; } |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Per altro uno dei primi "tricks" per rendere il codice STL più scattante è proprio quello di non farlo ritornare dalla funzione ma di lavorare sul parametro passato per riferimento: in questo modo si risparmiano almeno due copie (quella per passaggio del parametro e quella necessaria per il return).
Mica male ![]()
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Capito, non sono stato l'unico a tornare ubriaco ieri notte...
![]() Quote:
![]() Scherzo, Albi89... ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
![]() Non ero ubriaco ma avevo festeggiato il ritorno alla civiltà... con risultati visibili ![]()
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:11.