2013-07-18 1 views
9

Ich versuche, einen Vektor zu erstellen, der ein int und eine Zeichenfolge enthält. Ist das möglich?Erstellen eines Vektors, der zwei verschiedene Datentypen oder Klassen enthält

Zum Beispiel möchte ich vector<int>myArrstring x= "Picture This"

+1

http://www.boost.org/doc/libs/1_54_0/doc/html/variant.html – chris

+0

mögliches Duplikat von [Erstellen eines Arrays, das Objekte verschiedener Klassen in C++ enthalten kann] (http: // stackoverflow .com/questions/2764671/creating-an-array-which-can-hold-Objekte-of-different-classes-in-c) – hivert

+0

Warte, willst du, dass es beide oder einen int oder eine Zeichenkette enthält in jedem Element? – chris

Antwort

2

Nein zu halten, muss ein vector nur Variablen vom Typ innerhalb der spitzen Klammern <> deklariert halten.

Sie könnten eine Klasse erstellen, die ein int Element und ein string Mitglied hat und dann eine vector erstellen Instanzen dieser Klasse zu halten, und dann referenzieren die int oder string Mitglieder, wenn Sie benötigen.

+5

Keine Notwendigkeit, Zeiger auf die Klasse zu speichern. – chris

+0

@chris Nun, das hängt von der Anwendung ab. –

+2

@CoryKlein: In der Tat. Der Ratschlag für Lernende sollte jedoch niemals Hinweise in Containern enthalten.Es wird so selten gebraucht, und so leicht zu vermasseln, dass kein Zweck gedient wird, indem man die Möglichkeit erklärt, bis das eigentliche Problem es erfordert. Und dann würden Sie immer noch intelligente Zeiger vorschlagen. – MSalters

0

Nr. myArr wird instanziiert, um int Typ zu halten. Es kann nur int Typ speichern.

15

Sie können eine Union verwenden, aber es gibt bessere Alternativen.

Sie können boost::variant nutzen diese Art von Funktionalität zu erhalten:

using string_int = boost::variant<std::string, int>; 

std::vector<string_int> vec; 

Um entweder einen String oder ein int aus einer Variante zu bekommen, können Sie boost::get verwenden:

std::string& my_string = boost::get<std::string>(vec[0]); 

bearbeiten
Nun, es ist 2017 jetzt. Sie brauchen Boost nicht mehr zu haben variant, wie wir jetzt std::variant haben!

+0

Sie können einen "Vektor" vom Typ "union" mit einer Zeichenfolge fester Größe ('const char []') und einer Ganzzahl erstellen, ohne dass Sie boost verwenden müssen. Sie können auch 'std :: string' verwenden, aber Sie müssen die' union' in einer 'struct' mit einem type -Tag für den Destruktor platzieren, um den richtigen Typ zum Löschen auszuwählen. Siehe das Ende des Links in meiner Antwort. – devil

+0

Tut mir leid, ich brauche nicht die 'const' für die' char [] '. – devil

+0

@devil Es gibt einige gute Gründe, Boost nicht zu verwenden. –

4

Wenn Sie wollen, dass der Vektor zwei verschiedene Arten zu halten, können Sie ein verwenden std::pair (oder std::tuple, wenn mehr als zwei)

In C++ 03:

std::vector<std::pair<int, std::string> > myArr; 

Wenn Sie wollen, dass der Vektor Halten Sie einen Typ, der als zwei verschiedene Arten verwendet werden kann: Nein, es kann nicht getan werden.

9

Ja, es ist möglich, zwei verschiedene Typen zu halten, Sie können einen vector von Typen erstellen. Der verwendete Speicherplatz ist der größere der Typen. Union-Typen werden erklärt here zusammen mit, wie Sie den Typ kennzeichnen können. Ein kleines Beispiel:

union Numeric 
{ 
    int i; 
    float f; 
}; 

std::vector<Numeric> someNumbers; 
Numeric n; 
n.i = 4; 
someNumbers.push_back(n); 

Sie können auch std::string verwenden, aber Sie müssen die union in einem struct mit einem Typ-Tag für den destructor legen Sie den richtigen Typen zu wählen, zu zerstören. Siehe das Ende des Links.