2013-07-18 45 views
9

Bir int ve bir dize tutan bir vektör oluşturmaya çalışıyorum. Mümkün mü? Örneğin İki farklı veri türünü veya sınıfını tutan bir vektör oluşturma

Ben açılı ayraçlar < > içinde bildirilmiş türde string x= "Picture This"

+1

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

+0

olası bir kopyası [C++ 'da farklı sınıfların nesnelerini tutabilecek bir dizi oluşturma] (http: // stackoverflow .com/questions/2764671/create-an-array-hangi-can-hold-nesneleri-of-farklı-sınıfları-in-c) – hivert

+0

Bekleyin, ikisini de veya int ya da string tutmak ister misiniz her elementte? – chris

cevap

2

Hayır, bir vector sadece tutmalı değişkenleri tutmak vector<int>myArr istiyorum.

Bir int üyesi ve string üyesine sahip olan bir sınıf oluşturmak ve sonra bu sınıfın örneklerini tutmak için bir vector oluşturun ve gerektiğinde daha sonra int veya string üyelerine başvuruda başladı. int türünde

+5

Sınıfa işaretçiler kaydetmeye gerek yok. – chris

+0

@chris Peki, bu uygulamaya bağlı olurdu. –

+2

@CoryKlein: Gerçekten. Ancak öğrenenler için tavsiye, kaplarda işaretçilerden hiç bahsetmemelidir.Çok nadiren ihtiyaç duyuluyor ve bu kadar kolay dağılıyor, eldeki asıl sorun ona ihtiyaç duyulana kadar bu olasılığı açıklayarak hiçbir amaca hizmet etmiyor. Ve sonra akıllı işaretçiler önerirsiniz. – MSalters

0
No.

numaralı myArr türüne örnekleme gerçekleştirilmiştir. Yalnızca int türünü depolayabilir.

15

Bir birliği kullanabilirsiniz, ancak daha iyi alternatifler vardır.

Sen işlevsellik bu tür almak için boost::variant kullanabilirsiniz:

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

std::vector<string_int> vec; 

bir dize ya da varyant dışında bir int ya almak için, boost::get kullanabilirsiniz:

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

Düzenleme
Eh, şimdi 2017. Artık, std::variant'a sahip olduğumuz için variant'a sahip olmak için Boost'a ihtiyacınız yok!

+0

Sabit boyutlu bir dize ('const char []') ve destek kullanmanıza gerek kalmadan bir tamsayıya sahip bir '' '' '' '' '' '' '' '' '' ''' oluşturabilirsiniz. Ayrıca 'std :: string' kullanabilirsiniz, ancak yok etmek için doğru türü seçmek için destructor için bir tür etiketi ile' struct' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' ''. Cevabımdaki bağlantının sonuna bak. – devil

+0

Üzgünüz, char [] 'için' const' gerekmez. – devil

+0

@devil _not_ kullanımı Boost için birkaç iyi sebep vardır. –

4

vektör kullanabileceğiniz iki farklı türlerini tutmak istiyorsanız bir std::pair (veya std::tuple eğer ikiden fazla)

03 C++:

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

vektör istiyorsanız İki farklı tip olarak kullanılabilecek bir tip tutun: Hayır, yapılamaz.

9

Evet iki farklı türde tutmak mümkündür, vectorunion türlerini oluşturabilirsiniz. Kullanılan alan türlerden daha büyük olacaktır. Sendika türleri, türünü nasıl etiketleyebileceğinizle birlikte here açıklanır. Küçük bir örnek:

union Numeric 
{ 
    int i; 
    float f; 
}; 

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

Ayrıca std::string kullanabilirsiniz ancak yok etmek doğru türünü seçmek için yıkıcı için bir tür etiketine sahip bir struct içinde union yerleştirmek gerekir. Bağlantının sonuna bakın.

İlgili konular