มีความแตกต่างระหว่างsize_t
และcontainer::size_type
หรือไม่?
สิ่งที่ฉันเข้าใจคือsize_t
ทั่วไปกว่าและสามารถใช้กับsize_type
s ใดก็ได้
แต่container::size_type
เหมาะสำหรับคอนเทนเนอร์บางประเภทหรือไม่?
มีความแตกต่างระหว่างsize_t
และcontainer::size_type
หรือไม่?
สิ่งที่ฉันเข้าใจคือsize_t
ทั่วไปกว่าและสามารถใช้กับsize_type
s ใดก็ได้
แต่container::size_type
เหมาะสำหรับคอนเทนเนอร์บางประเภทหรือไม่?
คำตอบ:
ภาชนะบรรจุที่มาตรฐานกำหนดsize_type
เป็น typedef ให้Allocator::size_type
(จัดสรรเป็นพารามิเตอร์ที่ template) ซึ่งstd::allocator<T>::size_type
เป็นมักจะกำหนดให้เป็นsize_t
(หรือชนิดที่เข้ากันได้) ดังนั้นสำหรับกรณีมาตรฐานจะเหมือนกัน
อย่างไรก็ตามหากคุณใช้ตัวจัดสรรแบบกำหนดเองอาจใช้ประเภทพื้นฐานอื่นได้ ดังนั้นจึงcontainer::size_type
เป็นที่นิยมสำหรับความทั่วไปสูงสุด
size_t
นั้นการเดิมพันในทางปฏิบัติของข้อ จำกัด เหล่านั้นคืออะไร อย่างไรก็ตามใน C ++ 11 ตอนนี้ถูกกำหนดโดยพื้นฐานเป็น: std::make_unsigned<X::difference_type>::type
โดยค่าเริ่มต้น size_t
ซึ่งในทางปฏิบัติอาจจะเป็นเหมือนกันหรือเข้ากันได้กับ
size_type
เลิกใช้งาน สิ่งที่ช่วยให้?
size_t
ถูกกำหนดให้เป็นชนิดที่ใช้สำหรับขนาดของวัตถุและขึ้นอยู่กับแพลตฟอร์มcontainer::size_type
เป็นชนิดที่ใช้สำหรับจำนวนขององค์ประกอบในภาชนะและเป็นภาชนะขึ้นstd
คอนเทนเนอร์ทั้งหมดใช้size_t
เป็นsize_type
แต่ผู้ให้บริการไลบรารีอิสระแต่ละรายจะเลือกประเภทที่พบว่าเหมาะสมกับคอนเทนเนอร์ของตน
หากคุณมองไปที่ qtคุณจะพบว่าsize_type
คอนเทนเนอร์ Qt ขึ้นอยู่กับเวอร์ชัน ใน Qt3 คือunsigned int
และใน Qt4 เปลี่ยนเป็นint
.
int
มากกว่าssize_t
, int
เป็นชนิดของขนาดเล็ก
สำหรับstd::[w]string
, std::[w]string::size_type
คือการที่เท่าเทียมกันซึ่งจะมีค่าเท่ากับstd::allocator<T>::size_type
std::size_t
สำหรับคอนเทนเนอร์อื่น ๆ เป็นการใช้งานบางประเภทที่กำหนดประเภทจำนวนเต็มที่ไม่ได้ลงนาม
บางครั้งการมีประเภทที่แน่นอนก็มีประโยชน์ตัวอย่างเช่นเรารู้ว่าประเภทนั้นล้อมรอบไปที่ใด (like, to UINT_MAX
) เพื่อให้สามารถใช้ประโยชน์จากสิ่งนั้นได้ หรือสำหรับเทมเพลตที่คุณต้องส่งผ่านสองประเภทที่เหมือนกันไปยังเทมเพลตฟังก์ชัน / คลาส
บ่อยครั้งที่ฉันพบว่าฉันใช้size_t
เพื่อความกะทัดรัดหรือทำซ้ำอยู่แล้ว ในโค้ดทั่วไปเนื่องจากโดยทั่วไปคุณไม่ทราบว่าเทมเพลตของคุณใช้กับอินสแตนซ์คอนเทนเนอร์ใดและคอนเทนเนอร์เหล่านั้นมีขนาดเท่าใดคุณจะต้องใช้Container::size_type
typedef หากคุณต้องการจัดเก็บขนาดคอนเทนเนอร์
N1804
และฉันไม่เห็นความสัมพันธ์ระหว่างและAllocator::size_type
size_type
การดูอย่างรวดเร็วที่ libstdc ++ ไม่แสดงสิ่งที่คล้ายกับสิ่งนี้