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>myArr
string x= "Picture This"
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>myArr
string x= "Picture This"
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.
Keine Notwendigkeit, Zeiger auf die Klasse zu speichern. – chris
@chris Nun, das hängt von der Anwendung ab. –
@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
Nr. myArr
wird instanziiert, um int
Typ zu halten. Es kann nur int
Typ speichern.
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!
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
Tut mir leid, ich brauche nicht die 'const' für die' char [] '. – devil
@devil Es gibt einige gute Gründe, Boost nicht zu verwenden. –
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.
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.
http://www.boost.org/doc/libs/1_54_0/doc/html/variant.html – chris
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
Warte, willst du, dass es beide oder einen int oder eine Zeichenkette enthält in jedem Element? – chris