'size_t' เทียบกับ 'คอนเทนเนอร์ :: size_type'


108

มีความแตกต่างระหว่างsize_tและcontainer::size_typeหรือไม่?

สิ่งที่ฉันเข้าใจคือsize_tทั่วไปกว่าและสามารถใช้กับsize_types ใดก็ได้

แต่container::size_typeเหมาะสำหรับคอนเทนเนอร์บางประเภทหรือไม่?

คำตอบ:


108

ภาชนะบรรจุที่มาตรฐานกำหนดsize_typeเป็น typedef ให้Allocator::size_type(จัดสรรเป็นพารามิเตอร์ที่ template) ซึ่งstd::allocator<T>::size_typeเป็นมักจะกำหนดให้เป็นsize_t(หรือชนิดที่เข้ากันได้) ดังนั้นสำหรับกรณีมาตรฐานจะเหมือนกัน

อย่างไรก็ตามหากคุณใช้ตัวจัดสรรแบบกำหนดเองอาจใช้ประเภทพื้นฐานอื่นได้ ดังนั้นจึงcontainer::size_typeเป็นที่นิยมสำหรับความทั่วไปสูงสุด


2
คุณสามารถชี้แจงคำตอบนี้ได้หรือไม่? ผมมองย้อนกลับไปที่ร่างมาตรฐานไกลกลับเป็นN1804และฉันไม่เห็นความสัมพันธ์ระหว่างและAllocator::size_type size_typeการดูอย่างรวดเร็วที่ libstdc ++ ไม่แสดงสิ่งที่คล้ายกับสิ่งนี้
Shafik Yaghmour

1
@ShafikYaghmour ดังนั้นคำตอบนี้จึงล้าสมัยเล็กน้อย แต่เพื่อเพิ่มความสะดวกในการพกพาฉันคิดว่าคำแนะนำยังคงฟังอยู่: C ++ 03 ระบุ "ตารางที่ 32: size_type: ประเภทที่สามารถแสดงขนาดของวัตถุที่ใหญ่ที่สุดในรูปแบบการจัดสรร" ในเวลาsize_tนั้นการเดิมพันในทางปฏิบัติของข้อ จำกัด เหล่านั้นคืออะไร อย่างไรก็ตามใน C ++ 11 ตอนนี้ถูกกำหนดโดยพื้นฐานเป็น: std::make_unsigned<X::difference_type>::typeโดยค่าเริ่มต้น size_tซึ่งในทางปฏิบัติอาจจะเป็นเหมือนกันหรือเข้ากันได้กับ
Evan Teran

2
ดูแลคำตอบไม่ถูกต้อง .... ดูstackoverflow.com/questions/4849678/… TL: DR: จัดสรรขนาด _type ต้องเป็น size_t และใน C ++ 17 size_type จะเลิกใช้งานตามที่เป็นอยู่
user3063349

1
@ user3063349 ฉันไม่เห็นอะไรเลยในหน้านั้นหรือใน C ++ 2017 Standard (23.10.8) เพื่อบอกใบ้ถึงการsize_typeเลิกใช้งาน สิ่งที่ช่วยให้?
Marc.2377

42
  • size_tถูกกำหนดให้เป็นชนิดที่ใช้สำหรับขนาดของวัตถุและขึ้นอยู่กับแพลตฟอร์ม
  • container::size_typeเป็นชนิดที่ใช้สำหรับจำนวนขององค์ประกอบในภาชนะและเป็นภาชนะขึ้น

stdคอนเทนเนอร์ทั้งหมดใช้size_tเป็นsize_typeแต่ผู้ให้บริการไลบรารีอิสระแต่ละรายจะเลือกประเภทที่พบว่าเหมาะสมกับคอนเทนเนอร์ของตน

หากคุณมองไปที่ คุณจะพบว่าsize_typeคอนเทนเนอร์ Qt ขึ้นอยู่กับเวอร์ชัน ใน Qt3 คือunsigned intและใน Qt4 เปลี่ยนเป็นint.


1
ฉันคิดว่ามันค่อนข้างแปลกที่มีขนาดของบางอย่างที่แสดงเป็น int เราเคยมีขนาดลบสำหรับคอนเทนเนอร์หรือไม่?
Mihai Todor

10
@MihaiTodor: ไม่ใช่เรื่องแปลกที่ผู้คนจะใช้ประเภทที่มีลายเซ็นสำหรับทุกสิ่งฉันเดาว่า Qt กำลังทำตามอย่างเหมาะสม เหตุผลก็คือการปฏิบัติการแบบผสม (โดยเฉพาะการเปรียบเทียบ) เป็นพื้นที่ภัยพิบัติที่หลาย ๆ คนอยากจะหลีกเลี่ยงการใช้ประเภทตัวเลขที่ไม่ได้ลงนามมากกว่าที่จะต้องจัดการและ / หรือหลีกเลี่ยงการดำเนินการแบบผสม เพียงเพราะไม่ได้ลงนามประเภทที่ไม่สามารถแสดงตัวเลขติดลบไม่ได้หมายความว่าคุณมีการใช้พวกเขาสำหรับตัวเลขที่ไม่สามารถเป็นค่าลบ :-) ผมสารภาพฉันประหลาดใจมันเป็นintมากกว่าssize_t, intเป็นชนิดของขนาดเล็ก
Steve Jessop

2
"คอนเทนเนอร์มาตรฐานทั้งหมดใช้ size_t เป็น size_type" เป็นเท็จและทำให้เข้าใจผิดอย่างมาก ใช่พวกเขาทำโดยปกติ (อย่างน้อยคอมไพเลอร์ทั้งหมดของฉันก็ทำแบบนั้น) แต่การอ้างอิงภาษา C ++ ไม่ได้ระบุว่าต้องคล้ายกันสำหรับคอนเทนเนอร์ stl ทั้งหมด !! ห่วงใย
เหลือเกิน


8

สำหรับstd::[w]string, std::[w]string::size_typeคือการที่เท่าเทียมกันซึ่งจะมีค่าเท่ากับstd::allocator<T>::size_type std::size_tสำหรับคอนเทนเนอร์อื่น ๆ เป็นการใช้งานบางประเภทที่กำหนดประเภทจำนวนเต็มที่ไม่ได้ลงนาม

บางครั้งการมีประเภทที่แน่นอนก็มีประโยชน์ตัวอย่างเช่นเรารู้ว่าประเภทนั้นล้อมรอบไปที่ใด (like, to UINT_MAX) เพื่อให้สามารถใช้ประโยชน์จากสิ่งนั้นได้ หรือสำหรับเทมเพลตที่คุณต้องส่งผ่านสองประเภทที่เหมือนกันไปยังเทมเพลตฟังก์ชัน / คลาส

บ่อยครั้งที่ฉันพบว่าฉันใช้size_tเพื่อความกะทัดรัดหรือทำซ้ำอยู่แล้ว ในโค้ดทั่วไปเนื่องจากโดยทั่วไปคุณไม่ทราบว่าเทมเพลตของคุณใช้กับอินสแตนซ์คอนเทนเนอร์ใดและคอนเทนเนอร์เหล่านั้นมีขนาดเท่าใดคุณจะต้องใช้Container::size_typetypedef หากคุณต้องการจัดเก็บขนาดคอนเทนเนอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.