2016-10-01 3 views
3

Ziemlich neu in C++. Bezug nehmend auf diesen Codeschnipsel:Hat jedes Element in einem Vektor eine eindeutige Speicheradresse?

Insbesondere bei der Initialisierung des Iterators und der Endbedingung. Hat jedes Element im Vektor eine eindeutige Speicheradresse, auf die es zeigen kann? Oder arbeiten Iteratoren anders als Zeiger?

+1

Sie können nicht anders als Zeiger arbeiten. Der Iterator ist eine Bibliothek, die eine Person wie du aus C++ erstellt hat. Zeiger sind in C++ Sprache – amanuel2

+0

@ amanuel2 gebaut - so hat jedes Vektorelement eine eindeutige Speicheradresse? Oder hat der Vektor nur eine Adresse? – MKSnazzy

+1

Jedes Element hat eine eindeutige Speicheradresse. Vektoren basieren auf einem Zeiger (qrray) von Zeigern. Ich werde bald eine Antwort schreiben – amanuel2

Antwort

6

Obwohl Iteratoren sind nicht unbedingt Zeiger (obwohl für std::vector s die meisten Nicht-Debug-Implementierungen sie als dünne Wrapper um Zeiger implementieren), std::vectorguaranteed ist seine Elemente im Speicher zusammenhängend zu haben. Was bedeutet, dass YES, jedes Element einen eindeutigen Speicherort hat.

+1

lol @ 'std :: Vektor ' –

+0

@ChristopherOicles Haha, viele stimmen zu, dass 'std :: vector ' nicht als Container bezeichnet werden sollte. – vsoftco

+0

Yeah, meiner Meinung nach sollte es nicht die nussartige Ausnahme sein, die es ist, eher, wenn Sie einen optimierten Bitvektor wollen, verwenden Sie 'std :: bitset' –

2

Jedes Element hat tatsächlich eine eindeutige Adresse im Speicher. Betrachten wir im Grunde genommen diesen Beispielvektor:

template <class T> 
class vec 
{ 
public: 
vec() ; 
~vec() ; 
T * elements; 
} 

Sie können hier sehen, ist nur ein Beispiel für einen Vektor. Die Iteratoren zeigen also auf jeden Zeiger im Element. Sie haben möglicherweise keine eindeutige Adresse, aber sie zeigen auf jedes Element im Vektor. Jeder Iterator hat also UNIQUE Speicheradressen.

Und wie ich in meinen Kommentaren sagte, können sie nicht anders arbeiten, da die Vektoren und ihre Iteratoren Bibliotheken sind, die von Leuten wie Ihnen mit C++ erstellt wurden. Sie können nicht anders funktionieren als Zeiger, die in der Sprache C++ erstellt werden.

Auch von Referenzen: (draft von C++ 0x):

23.2.6 Klasse Schablonenvektor [Vector]

1 Ein Vektor ist eine Folge Behälter, der Iteratoren random access unterstützt . Darüber hinaus unterstützt es (amortisiert) konstante Zeit Einfügen und Löschen von Operationen am Ende; Einfügen und Löschen in der Mitte nehmen lineare Zeit. Storage Verwaltung wird automatisch behandelt, obwohl Hinweise gegeben werden können, um die Effizienz zu verbessern. Die Elemente eines Vektor sind zusammenhängend gespeichert, was bedeutet, dass, wenn v ein vector<T, Allocator> ist, wo T eine Art ist, andere als Bool, dann gehorcht er die Identität &v[n] == &v[0] + n für alle 0 <= n < v.size().

+0

Da ich ziemlich neu in C++ bin, weiß ich nicht, was der meiste Code bedeutet. Sagen Sie, dass jeder Iterator eine eindeutige Adresse hat? Oder jedes Vektorelement hat eine eindeutige Adresse? – MKSnazzy

+0

@Matt was ich sage ist, dass jedes Vektorelement eine neue Adresse hat. Und jeder Iterator zeigt auf die Adresse des Vektorelements. – amanuel2

+0

@Matt Ich gehe davon aus, dass Sie über die Template-Spezialisierung sprechen. Das ist nur eine Möglichkeit, einen Typ zu erstellen, der definiert wird, wenn ein Objekt initiiert wird. Behandle T einfach als einen Typ wie int. – amanuel2

1

Aus [vector.overview]/1

vector A ist eine Folge Behälter, der Direktzugriffs Iteratoren unterstützt. Darüber hinaus unterstützt es (amortisiert) konstante Zeit Einfügen und Löschen von Operationen am Ende; Einfügen und Löschen in der Mitte nehmen lineare Zeit. Die Speicherverwaltung wird automatisch durchgeführt, es können jedoch Hinweise zur Verbesserung der Effizienz gegeben werden. Die Elemente eines Vektors werden zusammenhängend gespeichert. Dies bedeutet, dass wenn v ein vector<T, Allocator> ist, wobei T ein anderer Typ als bool ist, dann die Identität &v[n] == &v[0] + n für alle 0 <= n < v.size().

Emphasis Mine

So seit &v[n] gilt für für alle n in [0, size()) dann je Element in dem Vektor seine eigene einzigartige Adresse hat.

+0

Hallo, ich bin neuer zu C++, so dass einige davon verwirrend sind. Danke, dass Sie mir bestätigt haben, dass jedes Element eine eigene Speicheradresse hat. – MKSnazzy

+1

Er zitiert den Sprachstandard. Es heißt, Sie können '& v [i]' für jedes 'i' im Bereich verwenden und erhalten eine eindeutige Adresse, die Sie mit' * 'dereferenzieren können. – Davislor

2

Jedes Objekt (das zu einem bestimmten Zeitpunkt existiert) hat eine eindeutige Adresse. Die Elemente eines Vektors sind Objekte (mit Ausnahme der Monstrosität, die die std::vector<bool> Spezialisierung ist). Also ja, sie haben alle eindeutige Adressen. Beachten Sie jedoch, dass beim Hinzufügen von Elementen zu einem Vektor eine Neuzuordnung möglich ist. Und wenn es neu zugeordnet wird, werden alle alten Objekte zerstört und zu neuen Objekten mit unterschiedlichen Adressen verschoben, und der alte Speicher kann frei wiederverwendet werden, möglicherweise durch weitere Neuzuordnungen desselben Vektors. Folgendes ist möglich, zum Beispiel:

std::vector<int> v; 
v.push_back(0); 
std::intptr_t a0 = (std::intptr_t)&v[0]; 

v.push_back(1); // a reallocation may happen here 
v.push_back(2); // and perhaps another one here 

std::intptr_t a2 = (std::intptr_t)&v[2]; 

if (a0 == a2) { 
    std::cout << "This code is unlikely to be executed, but technically possible."; 
} 
+0

* "mit Ausnahme des ** Greuels **, das ist der' std :: vector '" * - Haha ... Ich musste dort pausieren und eine Aufzählung werfen, bevor ich weiter den Rest Ihrer Antwort las – WhiZTiM

Verwandte Themen