簡體   English   中英

只有兩個成員的 std::pair 和 std::tuple 之間的區別?

[英]Difference between std::pair and std::tuple with only two members?

std::pair和只有兩個成員的std::tuple之間有區別嗎? (除了明顯的std::pair需要兩個而且只有兩個成員和tuple可能有或多或少......)

有一些區別:

  1. 標准並不要求std::tuple永遠是standard-layout 如果TY都是標准布局,則每個std::pair<T, Y>都是標准布局。

  2. 獲取pair的內容比獲取tuple容易一些。 您必須在tuple案例中使用 function 調用,而pair案例只是一個成員字段。

但僅此而已。

std::tuple的名稱更長(一個額外的字符)。 更多這些字符是用右手輸入的,因此大多數人更容易輸入。

也就是說, std::pair只能有兩個值——不是零、一、三個或更多。 兩個值。 然而,元組對值的數量幾乎沒有語義限制。 因此,如果您確實想要指定一對值,則std::pair是一種更准確的類型安全類型。

這是一個非常晚的答案,但請注意,因為std::pair是用成員變量定義的,所以它的大小不能使用空基 class 優化來優化( firstsecond必須占用不同的地址,即使一個或兩個都是空類) . 無論 alignment 要求second_type所具有的任何情況都會加劇這種情況,因此在最壞的情況下,生成的std::pair基本上將是所需大小的兩倍。

std::tuple僅允許通過輔助函數進行訪問,因此如果一個或另一個為空,它可以從任一類型派生,從而節省開銷。 至少,GCC 的實現肯定是這樣做的……您可以通過標頭來驗證這一點,但也有作為證據。

請注意,使用 C++ 17,可以使用相同的接口從具有兩個元素的對和元組中讀取數據。

auto [a, b] = FunctionToReturnPairOrTuple();

無需使用get<> :)

對於它的價值,我發現 std::tuple 的 GDB output 更難閱讀。 顯然,如果您需要超過 2 個值,則 std::pair 將不起作用,但我確實認為這是支持結構的一點。

也許值得注意的是,cppreference 指出:

“一對是具有兩個元素的 std::tuple 的特定情況。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM