2016-03-02 70 views
3

我有這樣的情況:的std ::元組VS的std ::數組作爲性病的項目::矢量

std::vector<4_integers> v; 

什麼會最適合在這裏?

std::tuple解決方案:

std::vector<std::tuple<int,int,int,int>> v; 

std::array解決方案:

std::vector<std::array<int,4>> v; 

,爲什麼?

EDIT(用例):

對不起,不提的是,之前。我將用它如下:

for(const auto& item:v){ 
    some_function(item[0],item[1],item[2],item[3]); // or tuple equivalent 
} 

當然,我需要讓他們存儲,因爲計算的4個整數是不是我要一遍又一遍重複的事情。

+3

兩種可能的解決方案,以*一些*問題......現在這一切都取決於什麼* *具體的問題你正面臨着。請注意,所有問題都不相同,正如所有解決方案不相同。 – Nawaz

+0

取決於你將如何使用它們。 – marom

+0

有什麼問題?添加了 –

回答

2

對於這個特定的情況下,我不得不與意見不同意。對於均勻型的容器 - 如這裏的情況下(所有int S) - array優越。

當看着std::tuplestd::array的接口時,很明顯後者是一個容器(帶有迭代器,例如),而前者不是。這意味着標準庫的其餘部分將更自然地適用於後者。

如果類型並不均勻,不會有一個問題 - 它必須是std::tuple

+0

當你還沒有告訴我們他正試圖解決什麼問題時,你對OP的用例做了很多假設。對於我們所知道的,他可能有成千上萬個基於std :: tuple的代碼行。或者元組中的「int」實際上可能來自單個模板參數,在某個特定情況下恰好相等。 –

+0

這些類型可能是偶然的(這啓發我回答) –

+0

是的,你們都是對的 - 答案假定類型是同質的,並且具有一定的意義。好點子。 –

2

這取決於所使用的情況很多,但如果要素某種聯繫,我會選擇array。你可以在數組上迭代並使用std算法。

我通常認爲tuple作爲替代品的東西,你可以用一個struct像更換:

struct fourIntegers{ 
    int int1; 
    int int2; 
    int int3; 
    int int4; 
}; 

有時候tuple比新struct只是更緊湊/清除。

4

在我看來,這取決於這些事實是否是偶然的,或者是因爲它是相同類型的數據。

身高:array如果這些都與數字,都應該具有相同的類型(即學生對考試4例如等級)。您可能需要重複這些,它們的類型被鏈接...

身高:tuplestruct/class如果這些是4個int不相關,通常s表示不具有相同的尺寸(例如電阻,最大電壓,電阻的長度)。

另一種決定方式是,你可能在未來某個時候想要改變其中一個值的類型而不是其他值?

現在有些病例在邊緣。例如,一個盒子的長度,寬度和高度是多少?它們都具有相同的尺寸(例如米),但它們具有不同的含義。迭代他們並沒有多大意義。這實際上取決於您在代碼中如何使用它,以及您看到您正在使用的數據的方式。個人而言,在大多數情況下,可以使用tuple,我寧願使用class,因爲它提供了更多可讀代碼和更多的進化靈活性:您提供有意義的名稱,您決定屬性的可見性,你可以封裝的信息,可以提供輔助方法......

這種代碼:

BoxSize clothesBoxSize(5, 4, 10); 
double volume = clothesBoxSize.Volume(); 

甚至,如果你想防止混合寬度,長度和高度(見第18項斯科特邁爾斯'Effective C++):

BoxSize clothesBoxSize(Length(5), Width(4), Height(10)); 
double volume = clothesBoxSize.Volume(); 

比更具可讀性,可測試性和maintanable(在我看來):

std::tuple<int, int, int> clothesBoxSize{5, 4, 10}; 
double volume = clothesBoxSize[0] * clothesBoxSize[1] * clothesBoxSize[2]; 
+0

好點。