Domanda

Se ho in C ++ un puntatore a un vettore:

vector<int>* vecPtr;

E mi piacerebbe per accedere a un elemento del vettore, quindi posso fare questo dereferncing il vettore:

int a = (*vecPtr)[i];

ma questo dereferenziazione effettivamente creare una copia del mio vettore nello stack? diciamo che i negozi vettoriali 10000 int, sarà dereferenziando il vecPtr 10000 int essere copiati?

Grazie!

È stato utile?

Soluzione

10000 ints non verranno copiati. Dereferencing è molto a buon mercato.

Per mettere in chiaro è possibile riscrivere

int a = (*vecPtr)[i];

come

vector<int>& vecRef = *vecPtr; // vector is not copied here
int a = vecRef[i];

Inoltre, se si ha paura che i dati archiviati in tutto vector sarà situato nello stack e si utilizza vector<int>* invece di vector<int> per evitare questo: non è questo il caso. In realtà soltanto una quantità fissa di memoria è utilizzato in pila (circa 16-20 byte seconda dell'implementazione), indipendentemente dal numero di elementi memorizzati nel vector. Il vector si alloca elementi di memoria e memorizza sul mucchio.

Altri suggerimenti

No, niente verrà copiato; dereferencing appena dice C ++ che si vuole invocare operatore [] sulla vector , non sul puntatore , vecPtr. Se non è stato dereferenziare, C ++ sarebbe provare a cercare un operatore [] definita dal tipo std::vector<int>*.

Questo può ottenere davvero confuso, dal momento che operator[] è definito per tutti i tipi di puntatore, ma per un valore di compensazione il puntatore come se indicò una serie di vector<int>. Se desideri davvero assegnato solo un singolo vettore lì, poi per qualsiasi indice diverso 0, l'espressione restituisce un riferimento alla spazzatura, in modo otterrete sia un segfault o qualcosa che non ti aspettavi.

In generale, l'accesso ai vettori tramite un puntatore è un dolore, e la sintassi (*vecPtr)[index] è imbarazzante (ma meglio di vecPtr->operator[](index)). Invece, è possibile utilizzare:

vecPtr->at(index)

Questo in realtà controlla gamme, a differenza operator[], quindi se non si vuole pagare il prezzo per verificare se index è in limiti, sei bloccato con (*vecPtr)[].

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top