ประสิทธิภาพ :
มันขึ้นอยู่กับ.
ในกรณีเฉพาะของคุณจะไม่มีความแตกต่างของประสิทธิภาพเนื่องจากทั้งสองจะถูกวางในหน่วยความจำในทำนองเดียวกัน
ในกรณีที่เฉพาะเจาะจงมาก (ถ้าคุณใช้โครงสร้างว่างเปล่าเป็นหนึ่งในสมาชิกข้อมูล) ดังนั้นstd::pair<>
อาจใช้ประโยชน์จากการเพิ่มประสิทธิภาพฐานที่ว่างเปล่า (EBO) และมีขนาดต่ำกว่าเทียบเท่าโครงสร้าง และขนาดที่ต่ำกว่าโดยทั่วไปหมายถึงประสิทธิภาพที่สูงขึ้น:
struct Empty {};
struct Thing { std::string name; Empty e; };
int main() {
std::cout << sizeof(std::string) << "\n";
std::cout << sizeof(std::tuple<std::string, Empty>) << "\n";
std::cout << sizeof(std::pair<std::string, Empty>) << "\n";
std::cout << sizeof(Thing) << "\n";
}
พิมพ์: 32, 32, 40, 40 ideone
หมายเหตุ: ฉันไม่ได้ตระหนักถึงการใช้งานใด ๆ ที่ใช้เคล็ดลับ EBO สำหรับคู่ปกติ แต่โดยทั่วไปจะใช้สำหรับสิ่งอันดับ
การอ่าน :
นอกเหนือจากการปรับให้เหมาะสมแบบไมโครอย่างไรก็ตามโครงสร้างที่ตั้งชื่อนั้นถูกต้องตามหลักสรีรศาสตร์มากกว่า
ฉันหมายความว่าmap[k].first
ไม่ใช่เรื่องเลวร้ายในขณะที่get<0>(map[k])
แทบจะไม่สามารถเข้าใจได้ ความคมชัดmap[k].name
ที่แสดงถึงสิ่งที่เรากำลังอ่านในทันที
ทุกอย่างมีความสำคัญมากขึ้นเมื่อประเภทสามารถแปลงให้เป็นประเภทอื่นได้เนื่องจากการสลับเปลี่ยนเป็นประเภทที่ไม่ได้ตั้งใจกลายเป็นปัญหาที่แท้จริง
คุณอาจต้องการอ่านเกี่ยวกับ Structural vs Nominal Typing Ente
เป็นประเภทเฉพาะที่สามารถดำเนินการได้โดยสิ่งที่คาดหวังEnte
อะไรก็ตามที่สามารถทำงานได้std::pair<std::string, bool>
สามารถทำงานกับพวกเขาได้ ... แม้ว่าจะมีstd::string
หรือbool
ไม่มีสิ่งที่พวกเขาคาดหวังเพราะstd::pair
ไม่มีความหมายที่เกี่ยวข้องกับมัน
การบำรุงรักษา :
ในแง่ของการบำรุงรักษาpair
ที่เลวร้ายที่สุดคือ คุณไม่สามารถเพิ่มฟิลด์
tuple
งานแสดงสินค้าที่ดีขึ้นในเรื่องนั้นตราบใดที่คุณผนวกฟิลด์ใหม่ทุกฟิลด์ที่มีอยู่จะยังคงเข้าถึงได้โดยดัชนีเดียวกัน ซึ่งไม่น่าเชื่อถือเหมือน แต่ก่อนอย่างน้อยคุณไม่จำเป็นต้องไปและอัปเดต
struct
เป็นผู้ชนะที่ชัดเจน คุณสามารถเพิ่มฟิลด์ได้ทุกที่ที่ต้องการ
สรุปแล้ว:
pair
เป็นสิ่งที่เลวร้ายที่สุดของทั้งสองโลก
tuple
อาจมีขอบเล็กน้อยในกรณีที่เฉพาะเจาะจงมาก (ประเภทที่ว่างเปล่า)
struct
ใช้
หมายเหตุ: หากคุณใช้ getters แล้วคุณสามารถใช้ฐานที่ว่างเปล่าหลอกตัวเองโดยไม่ต้องลูกค้าต้องรู้เกี่ยวกับมันเช่นเดียวกับในstruct Thing: Empty { std::string name; }
; ซึ่งเป็นเหตุผลว่าทำไมEncapsulationจึงเป็นหัวข้อถัดไปที่คุณควรคำนึงถึง
std::pair
คือโครงสร้าง