มีความแตกต่างระหว่าง an std::pair
และ an ที่std::tuple
มีสมาชิกเพียงสองคนหรือไม่? (นอกจากชัดเจนว่าstd::pair
ต้องการสมาชิกสองคนและเพียงสองคนและtuple
อาจมีมากกว่าหรือน้อยกว่า ... )
มีความแตกต่างระหว่าง an std::pair
และ an ที่std::tuple
มีสมาชิกเพียงสองคนหรือไม่? (นอกจากชัดเจนว่าstd::pair
ต้องการสมาชิกสองคนและเพียงสองคนและtuple
อาจมีมากกว่าหรือน้อยกว่า ... )
คำตอบ:
มีความแตกต่างบางประการ:
std::tuple
ไม่สามารถเป็นแบบมาตรฐานได้ (อย่างน้อยก็ไม่จำเป็นต้องเป็นไปตามมาตรฐาน) ทุกอย่างstd::pair<T, Y>
เป็นแบบมาตรฐานถ้าทั้งสองแบบT
และY
เป็นแบบมาตรฐาน
ง่ายกว่าเล็กน้อยที่จะรับเนื้อหาของpair
ไฟล์tuple
. คุณต้องใช้การเรียกฟังก์ชันในtuple
เคสในขณะที่pair
เคสเป็นเพียงฟิลด์สมาชิก
แต่เกี่ยวกับมัน
std::map
ใช้std::pair<const Key,T>
เป็นvalue_type
แม้ใน C ++ 11 tuples ใช้ในที่ไหนกันแน่std::map
?
std::map
หรือสิ่งที่ฉันหมายถึงว่าแทน
นี่เป็นคำตอบที่ล่าช้ามาก แต่โปรดทราบว่าเนื่องจากstd::pair
กำหนดด้วยตัวแปรสมาชิกจึงไม่สามารถปรับขนาดให้เหมาะสมโดยใช้การเพิ่มประสิทธิภาพคลาสพื้นฐานที่ว่างเปล่า ( first
และsecond
ต้องใช้ที่อยู่ที่แตกต่างกันแม้ว่าหนึ่งหรือทั้งสองจะเป็นคลาสว่างก็ตาม) สิ่งนี้เลวร้ายลงเนื่องจากข้อกำหนดในการจัดตำแหน่งใดก็ตามที่second_type
มีดังนั้นในกรณีที่เลวร้ายที่สุดผลลัพธ์std::pair
จะมีขนาดเป็นสองเท่าของขนาดที่ต้องการ
std::tuple
อนุญาตให้เข้าถึงผ่านฟังก์ชันตัวช่วยเท่านั้นดังนั้นจึงเป็นไปได้ที่จะได้มาจากประเภทใดประเภทหนึ่งถ้าอย่างใดอย่างหนึ่งว่างเปล่าโดยประหยัดค่าใช้จ่าย อย่างน้อยการใช้งาน GCC ก็ทำได้อย่างแน่นอน ... คุณสามารถโผล่ส่วนหัวเพื่อตรวจสอบสิ่งนี้ได้ แต่ก็มีสิ่งนี้เป็นหลักฐานด้วย
[[no_unique_address]]
ควรลบstd::pair
ข้อเสีย
std::tuple
ชื่อมีความยาว (ตัวละครตัวหนึ่งเป็นพิเศษ) อักขระเหล่านี้พิมพ์ด้วยมือขวาจำนวนมากขึ้นเพื่อให้คนส่วนใหญ่พิมพ์ได้ง่ายขึ้น
ที่กล่าวว่าstd::pair
สามารถมีได้เพียงสองค่า - ไม่ใช่ศูนย์หนึ่งสามหรือมากกว่า สองค่า อย่างไรก็ตามทูเปิลแทบไม่มีข้อ จำกัด เชิงความหมายเกี่ยวกับจำนวนค่า std::pair
จึงเป็นความถูกต้องแม่นยำมากขึ้นพิมพ์ชนิดปลอดภัยในการใช้งานถ้าคุณต้องการจริงเพื่อระบุคู่ของค่า
std::tuple<>
เป็นยังพิมพ์ปลอดภัย (ว่ามันอาจจะไม่?) และจะไม่มีความหมายที่แตกต่างกันมากกว่า2
pair
โปรดทราบว่าด้วย C ++ 17 เราสามารถใช้อินเทอร์เฟซเดียวกันเพื่ออ่านข้อมูลจากทั้งคู่และทูเพิลที่มีสององค์ประกอบ
auto [a, b] = FunctionToReturnPairOrTuple();
ไม่ต้องใช้get<>
:)
สำหรับสิ่งที่คุ้มค่าฉันพบว่าเอาต์พุต GDB ของ std :: tuple นั้นอ่านยากกว่ามาก เห็นได้ชัดว่าถ้าคุณต้องการมากกว่า 2 ค่า std :: pair จะไม่ทำงาน แต่ฉันถือว่าจุดนี้เป็นประโยชน์ของโครงสร้าง
std::get<0>(tupleName)
ในทะเยอทะยานนั้น GetX()
อ่านง่ายและสั้นกว่ามาก แต่ก็มีข้อเสียเล็ก ๆ ว่าถ้าคุณลืมที่จะทำให้มันเป็นคนวิธีการสามารถทำอะไรโง่เช่นนี้const
GetX() = 20;
.first
และ.second
สะดวก แต่ก็ไม่ให้ความช่วยเหลือหากจำเป็นต้องมีสมาชิกคนที่สาม (หรือมากกว่า) ในการเปลี่ยนแปลงรหัส ฉันสังเกตเห็นว่าฉันมักจะใช้std::get
โดยไม่คำนึงถึง Getters ใด ๆ ด้วยวิธีนี้ฉันไม่จำเป็นต้องเปลี่ยนทุกอย่างเพียงแค่ประเภทข้อมูลและmake_pair
สายเรียกเข้าmake_tuple
เท่านั้น