มีความแตกต่างระหว่าง 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เท่านั้น