2016-03-23 17 views
-1

Ich möchte die Boost-Bibliothek (Boost :: Variante) in C++ verwenden, um einen Vektor zu definieren, wenn ganze Zahlen und Zeichenfolgen. Ich bemühe mich, einen solchen Vektor zu füllen - kann jemand einen Beispielcode mit ints und stringsmit der Boost-Bibliothek füllen und liest Elemente des Vektors oder sonstwie mich auf ein Beispiel verweisen.Generieren eines Vektors mit int und String-Argumente

Ich suchte nach Artikeln mit der Tage boost::variants auf der SO, konnte aber nicht finden, was ich wollte.

+0

Was haben Sie bisher versucht? Beispielcode – DimChtz

+0

Wenn ich 'boost :: variant richtig bin, Vektor > v;' definiert einen Vektor 'v' mit int und String-Eingaben. Aber ich bin unsicher, wie ich es füllen soll. – Sid

+0

@DimChtz, ich habe auch auf den Boost [Tutorial] (http://www.boost.org/doc/libs/1_55_0/doc/html/variant/tutorial.html) – Sid

Antwort

1

Hier sind einige Beispiele (aus dem Gedächtnis geschrieben):

typedef boost::variant< 
    std::string, 
    int 
> StringOrInt; // using a typedef is just for convenience 

StringOrInt myVariant; 
myVariant = std::string("hello"); // both of these work 
myVariant = 5; 

std::vector<StringOrInt> myvec; 
myvec.push_back(5); 
myvec.push_back(std::string("hello")); 

Dann zu lesen, gibt es zwei Möglichkeiten. Einer benutzt boost :: get, der andere benutzt einen Besucher. Besucher sind normalerweise etwas robuster, aber wenn es ein einfacher Fall ist, kann boost :: get gut funktionieren.

Da Sie wahrscheinlich iterieren, wird ein Besucher wahrscheinlich besser arbeiten. Sie erstellen einen Funktor mit Überladungen für jeden Typ in Ihrer Variante und verwenden boost::apply_visitor. Zum Beispiel:

struct MyVisitor { 
    void operator()(const std::string& arg) const { 
     std::cout << "It was a string"; 
    } 

    void operator()(int arg) const { 
     std::cout << "It was an int"; 
    } 
}; 

MyVisitor myVisitor; 
for (auto& val : myvec) { 
    boost::apply_visitor(myVisitor, val); 
} 
+0

Ich bekomme den Kompilierungsfehler: Nein Matching-Funktion für den Aufruf von apply_visitor, wenn ich versuche, auf Elemente des Vektors zuzugreifen, indem ich darüber iteriere. Nämlich, wenn ich das letzte Segment des von Ihnen geposteten Codes verwende. Irgendwelche Vorschläge? – Sid

+0

Kannst du auch erklären, was der letzte Teil macht, d. H. Den Besucheranteil anwenden? – Sid

+0

Ich habe den Code aktualisiert. Es hätte die 'struct MyVisitor: public boost :: static_visitor <>' anstatt nur 'struct MyVisitor'. – Sid

0

Sie könnten einen Vektor von Zeichenfolgen erstellen und dann .toString() in den Positionen mit Zahlen verwenden. Oder zumindest in Java könnten Sie eine Klasse VectorIntString erstellen, die für jede Instanz der Klasse beide Vektoren enthält. Also, wenn Sie das Objekt konstruieren: Sie so etwas wie dies

VectorIntString vec= new VectorIntString(int a,String a, int b, String b.... ,); 

tun also der Konstruktor wird odds Position in das Int-Vektor und auch Positionen auf das String-Vektor hinzuzufügen.