451 Stimmen

Warum kann ich keinen Vektor von Referenzen erstellen?

Wenn ich das tue:

std::vector<int> hello;

Alles funktioniert bestens. Allerdings, wenn ich es ein Vektor von Referenzen statt:

std::vector<int &> hello;

Ich erhalte schreckliche Fehler wie

Fehler C2528: 'pointer' : Zeiger auf Referenz ist illegal

Ich möchte eine Reihe von Verweisen auf structs in einen Vektor zu setzen, so dass ich nicht mit Zeigern zu mischen haben. Warum ist vector wirft einen Wutanfall über diese? Ist meine einzige Möglichkeit, stattdessen einen Vektor von Zeigern zu verwenden?

54 Stimmen

Können Sie std::vector<reference_wrapper<int> > hello verwenden; siehe informit.com/guides/content.aspx?g=cplusplus&seqNum=217

7 Stimmen

@amit der Link ist nicht mehr gültig, offizielle Dokumentation aquí

15voto

Drew Dormann Punkte 54591

boost::ptr_vector<int> wird funktionieren.

Edita: war ein Vorschlag zur Verwendung von std::vector< boost::ref<int> > was nicht funktionieren wird, weil man keine Standard-Konstruktion einer boost::ref .

8 Stimmen

Aber Sie können einen Vektor oder nicht Standard-konstruierbare Typen haben, richtig? Sie müssen nur darauf achten, dass Sie nicht den Standard-Ctor des Vektors verwenden.

1 Stimmen

@Manuel: Oder resize .

5 Stimmen

Seien Sie vorsichtig, die Zeiger-Container von Boost übernehmen das alleinige Eigentum an den Zeigern. Zitat : "Wenn Sie eine gemeinsame Semantik benötigen, ist diese Bibliothek nicht das Richtige für Sie."

3voto

Martin Cote Punkte 27446

Wie andere bereits erwähnt haben, werden Sie wahrscheinlich am Ende mit einem Vektor von Zeigern statt.

Sie sollten jedoch die Verwendung eines ptr_Vektor stattdessen!

4 Stimmen

Diese Antwort ist nicht praktikabel, da ein ptr_vector ein Speicher sein soll. Das heißt, er wird die Zeiger beim Entfernen löschen. Er ist also für seinen Zweck nicht brauchbar.

0 Stimmen

Auf die eine oder andere Weise muss man irgendwo etwas aufbewahren! Docs: "Instanzen von std::reference_wrapper sind Objekte (sie können kopiert oder in Containern gespeichert werden)"

-1voto

Omid Punkte 189

Wie die anderen Kommentare andeuten, sind Sie auf die Verwendung von Zeigern beschränkt. Aber wenn es hilft, hier ist eine Technik zu vermeiden, direkt mit Zeigern konfrontiert.

Sie können etwa wie folgt vorgehen:

vector<int*> iarray;
int default_item = 0; // for handling out-of-range exception

int& get_item_as_ref(unsigned int idx) {
   // handling out-of-range exception
   if(idx >= iarray.size()) 
      return default_item;
   return reinterpret_cast<int&>(*iarray[idx]);
}

1 Stimmen

reinterpret_cast wird nicht benötigt

3 Stimmen

Wie die anderen Antworten zeigen, sind wir keineswegs auf die Verwendung von Zeigern beschränkt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X