2013-11-04 45 views
0
// create array 
Date** dateList = new Date*[SIZE]; 

// populate array 
for(int i = 0; i < SIZE; i++) { 
    dateList[i] = new Date[2]; 
    Date date; 
    date.input(); 

    dateList[i][0] = date; 

    int n = dateNum(date); 
    dateList[i][1] = n; 
} 

我想存儲在dateList[i][0]Date類型的對象,並在dateList[i][1]int。這可能嗎?我可以有不同類型的二維數組嗎?

謝謝。

+0

陣列工會這可能是UB的。 ? –

+2

如果你有想要存儲在那裏的結構明確的結構,那麼如果你想能夠混合然後聯合使用帶有Date int對的'struct'。 – Andrey

+0

如果你可以使用boost,可以嘗試'[boost.Any](http://www.boost.org/doc/libs/1_54_0/doc/html/any/s02.html)''。創建一個'Any'的數組,然後你可以存儲你想要的類型(類型擦除)。 –

回答

1

簡答:不。數組只有一種類型。對於多維數組也是如此。

閱讀有關結構或更高的數據結構(如map)以實現預期的效果。

4

單個數組必須是單一類型。如果您希望元素表示不同類型的數據,那麼數組中的元素需要是某種基類(指針),或者可能是區分類型,如variant

+0

也許bit-fiddling可以在同一個數組中執行int和float,但由於額外的讀/寫功能會變慢。當然,對於更大的對象而言,內存空間方面非常困難且效率低下。 –

+0

通常也是一個糟糕的主意。 – DAhrens

+0

@huseyintugrulbuyukisik:這樣做幾乎可以引發未定義的行爲。如果你分配一個'int',你不能假裝它是一個'float'。 –

1

有多種方法可以做到這一點。最直接的方法是使用union s:將要共享的類型放在一個union中,然後在代碼中使用與維度類型相對應的成員。但是,這種方法也是最具限制性的,因爲帶構造函數/析構函數的類型不能進入union

一種更便捷的方式來做到這一點是建立pair<Date,int>對象的一個​​一維數組,像這樣:

pair<Date,int>* dateList = new pair<Date,int>[SIZE]; 

// populate array 
for(int i = 0; i < SIZE; i++) { 
    Date date; 
    date.input(); 
    int n = dateNum(date); 

    dateList[i] = make_pair(date, n); 
} 
for(int i = 0; i < SIZE; i++) { 
    cout << "Date: " date[i].first << " "; 
    cout << "Int: " date[i].second << endl; 
} 

這種方法可以讓編譯器檢查類型更接近,給你一個更強大的解決方案。

2

除非你有壓倒性的理由不這樣做,這聽起來像你想的結構向量:

struct whatever { 
    Date date; 
    int n; 

    whatever(Date const &d, int i) : date(d), n(i) {}  
}; 

std::vector<whatever> dates; 

Date date; 
date.input(); 

dates.push_back(whatever(date, datenum(date));