2012-10-16 57 views
3

是否可以同時存儲所有的int,stringfloat?我已經看到了一些數組語法,但都以int array[]string array[]開頭,有沒有一種數組可以存儲各種基元和字符串值的方法?C++,如何將字符串,整型值和浮點值存儲到數組中並取回存儲的值

我不是很熟悉C++,但在java中有一個迭代器,它可以幫助您將這些存儲的值滾出並允許顯示那裏存儲的內容。 C++是否也有這個功能?

+0

@amit,指針顯然是可能的。我的經驗表明,算法可能會變得非常困難(記憶方式)。和:RTTI會變得麻煩。 –

+1

我知道這不是很有用,但爲什麼你需要這樣做?有一個陣列上有幾種類型可能會很混亂。你可以嘗試以不同方式建模你的解決方案嗎 – leo

+0

使用'std :: vector'比使用數組更具慣用(並且可維護)。 –

回答

4

對於基本類型,這很容易:它們可以混合到unionhttp://www.cplusplus.com/doc/tutorial/other_data_types/( - > Unions)。

對於複雜類型,如string,它會變得更加困難。

你可能想看看boost::varianthttp://www.boost.org/doc/libs/1_36_0/doc/html/variant.htmlboost::anyhttp://www.boost.org/doc/libs/1_51_0/doc/html/any.html

+1

'boost :: variant'是可取的,因爲他們知道他們想要存儲的所有類型? –

+0

C++現在允許在一個聯合中使用非POD類型(使用C++ 11)。 std :: string會起作用,當然還需要一些額外的工作來正確管理聯合成員對象的生命週期。 OTOH boost :: variant已經爲你做了所有的工作。 – bames53

+0

@ bames53謝謝!不知道。從來沒有過C++ 11!多可恥! –

1

如果這些值是相關的,然後創建一個結構和存儲,而不是個別值。例如:

struct person { 
    string name; 
    int age; 
}; 
person pArray[]; 
+0

偉大的答案,如果你不關心內存佔用。你還可以在運行時添加一個類型標識符enum {IS_FLOAT,IS_STRING,...}來標識類型。 –

+0

他們如何知道使用哪個價值? 'boost :: optional'可能有幫助嗎? –

+0

@RudolfMühlbauer:我不認爲他在推薦一個類似於工會的東西,他實際上建議重新考慮將多個對象放在一個數組中的方式(作爲對象) –