PDA

Visualizza la versione completa : [C++] Ottimizzazione gestione dei vettori


mlipreri
24-10-2007, 12:26
Riprendo la dichiarazione e implementazione delle classi citate in questo post:
http://forum.html.it/forum/showthread.php?s=&postid=11079748#post11079748
e aggiungo le modifiche sottocitate.

Se nella dichiarazione della classe Computer.h ho dichiarato un vettore in questo modo:


private:
vector<Computer> vComputer;

e poi ho aggiunto i metodi:


void addComputer(Computer _computer);
vector<Computer> getVectorComputer();


Nella classe Computer.cpp ho implementato i metodi in questo modo:


void Computer::addComputer(Computer _computer){
vComputer.push_back(_computer);
}

vector<Computer> Computer::getVectorComputer(){
return vComputer;
}


tutto ok funziona, ma se per caso questo vettore fosse molto grande e non vorrei passarlo per valore quale tecnica dovrei usare?
Grazie per il supporto.

mondobimbi
24-10-2007, 12:52
bisognerebbe vedere come viene implementato il costruttore di copia, in ogni caso puoi istanziare un puntatore a vector invece che un vector. Poi crei un alias per eseguire le operazioni sull'oggetto.
ciao
sergio

mlipreri
24-10-2007, 12:59
Ho pi o meno capito quindi dovrei istanziare un puntatore a un vector cos:

private:
vector<Computer>* vComputer;
e poi come faccio a creare un alias?
Grazie

MacApp
24-10-2007, 14:16
Originariamente inviato da mlipreri
Riprendo la dichiarazione e implementazione delle classi citate in questo post:
http://forum.html.it/forum/showthread.php?s=&postid=11079748#post11079748
e aggiungo le modifiche sottocitate.

Se nella dichiarazione della classe Computer.h ho dichiarato un vettore in questo modo:


private:
vector<Computer> vComputer;

e poi ho aggiunto i metodi:


void addComputer(Computer _computer);
vector<Computer> getVectorComputer();


Nella classe Computer.cpp ho implementato i metodi in questo modo:


void Computer::addComputer(Computer _computer){
vComputer.push_back(_computer);
}

vector<Computer> Computer::getVectorComputer(){
return vComputer;
}


tutto ok funziona, ma se per caso questo vettore fosse molto grande e non vorrei passarlo per valore quale tecnica dovrei usare?
Grazie per il supporto.

Puoi restituire il puntatore a vComputer od il suo riferimento:


vector<Computer> * Computer::getVectorComputerPointer(){
return &vComputer;
}

vector<Computer> & Computer::getVectorComputerRef(){
return vComputer;
}

in entrambi i casi viene NON viene copiato il vettore.
Ma attenzione:



void TestComputer (Computer * theComputer){
typedef vector<Computer> ComputerContainer;
ComputerContainer * aComputerContainerPointer = theComputer->getVectorComputerPointer (); // aComputerContainerPointer punta al membro vComputer di Computer
ComputerContainer & aComputerContainerRef = theComputer->getVectorComputerRef (); // aComputerContainerRef punta al membro vComputer di Computer
ComputerContainer aComputerContainerCopy = theComputer->getVectorComputerRef (); // aComputerContainerCopy una copia del membro vComputer di Computer;
}

nel terzo caso, pur chiamando getVectorComputerRef, il chiamante costruisce una copia di vComputer di Computer.

mondobimbi
24-10-2007, 14:21
un reference alias pu essere

vector<Computer> & vComputer_ref = *vComputer;

se modifiche vComuper_ref modifichi anche vComputer

ciao
sergio

mlipreri
24-10-2007, 15:53
Originariamente inviato da MacApp
Puoi restituire il puntatore a vComputer od il suo riferimento:


vector<Computer> * Computer::getVectorComputerPointer(){
return &vComputer;
}

vector<Computer> & Computer::getVectorComputerRef(){
return vComputer;
}

in entrambi i casi viene NON viene copiato il vettore.
Ma attenzione:



void TestComputer (Computer * theComputer){
typedef vector<Computer> ComputerContainer;
ComputerContainer * aComputerContainerPointer = theComputer->getVectorComputerPointer (); // aComputerContainerPointer punta al membro vComputer di Computer
ComputerContainer & aComputerContainerRef = theComputer->getVectorComputerRef (); // aComputerContainerRef punta al membro vComputer di Computer
ComputerContainer aComputerContainerCopy = theComputer->getVectorComputerRef (); // aComputerContainerCopy una copia del membro vComputer di Computer;
}

nel terzo caso, pur chiamando getVectorComputerRef, il chiamante costruisce una copia di vComputer di Computer.

ok! Ma perch se faccio:

aComputerContainerPointer.size()
mi da errore?

mlipreri
24-10-2007, 15:55
perch devo fare:

aComputerContainerPointer->size()
:dh:

Loading