2016-03-23 16 views
-1

Tamsayı ve dizgilerle bir vektör tanımlamak için destek kütüphanesini (boost :: variant) C++ içinde kullanmak istiyorum. Ben böyle bir vektör doldurmak için mücadele ediyorum - Birisi ya bir örnek kod ints ve stringsstringsBoost kütüphanesi kullanarak doldurur ve vektörün öğelerini okur veya başka bir örnek için yönlendirir.İnt ve dize bağımsız değişkenleri içeren bir vektör oluşturma

SO üzerinde boost::variants numaralı yazıları aradım ancak istediğimi bulamadım.

+0

Şimdiye kadar ne denediniz? örnek kod – DimChtz

+0

Eğer 'boost :: variant , vektör > v;' doğruysa, int ve dize girişleriyle bir vektörü tanımlar. Ama onu nasıl dolduracağım konusunda emin değilim. – Sid

+0

@DimChtz, ayrıca [http://www.boost.org/doc/libs/1_55_0/doc/html/variant/tutorial.html) – Sid

cevap

1

İşte (bellekten yazılmış) bazı örnekler:

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")); 

Sonra okumak için, iki yol vardır. Biri boost :: get, diğeri ziyaretçi kullanıyor. Ziyaretçi genellikle biraz daha sağlamdır, ancak basit bir durumsa, destek :: get iyi çalışabilir.

std::string& mystr = boost::get<std::string>(myvec[0]); // this will throw if the type you requested isn't what's stored 
std::string* mystr = boost::get<std::string*>(myvec[0]); // pointer version doesn't throw 

Muhtemelen yinelenen bir ziyaretçiden, muhtemelen bir ziyaretçi daha iyi çalışacaktır. Varyantınızdaki her tür için aşırı yüke sahip bir functor oluşturursunuz ve boost::apply_visitor'u kullanın. Örneğin:

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

derlemesini de [http://www.boost.org/doc/libs/1_55_0/doc/html/variant/tutorial.html] destekledim derleme hatası alıyorum: hayır vektörün öğelerine erişmeyi denediğimde, apply_visitor çağrısı için eşleme işlevi. Yani, gönderdiğiniz kodun son bölümünü kullanırsam. Baska öneri? – Sid

+0

, son bölümün ne yaptığını, yani ziyaretçi bölümünü nasıl uygulayabileceğinizi de açıklayabilir misiniz? – Sid

+0

Kodu güncelledim. Yapı MyVisitor: 'struct myVisitor' yerine 'struct noVisitor: public boost :: static_visitor <>' olmalıdır. – Sid

0

Dizelerden oluşan bir vektör oluşturabilir ve daha sonra, sayıların olduğu konumlarda .toString() öğesini kullanabilirsiniz. Ya da en azından Java'da, sınıfın her örneğinin her ikisinin de vektörlere sahip olduğu bir Class VectorIntString oluşturabilirsiniz. Eğer nesne oluşturmak Yani: So yapıcı Int vektörü ve dize vektör hatta pozisyonlarına oran pozisyonunu katacak bu

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

gibi bir şey yapacağız.

İlgili konular