ฉันไม่เห็นด้วยกับวิญญาณของคำตอบที่ยอมรับอย่างมากพอ "เครื่องมือสุดท้าย" ไกลจากมัน!
วิธีที่ฉันเห็นมันหนึ่งในคุณสมบัติที่แข็งแกร่งที่สุดของ C ++ เมื่อเทียบกับ C และสำหรับภาษาที่คล้ายกันอื่น ๆ คือความสามารถในการแสดงข้อ จำกัด เพื่อให้สามารถตรวจสอบได้ในเวลารวบรวมและป้องกันการใช้งานโดยไม่ตั้งใจ ดังนั้นเมื่อออกแบบโครงสร้างถามตัวคุณเองว่าควรอนุญาตให้ใช้งานอะไร การใช้งานอื่น ๆ ทั้งหมดนั้นเป็นสิ่งต้องห้ามและจะเป็นการดีที่สุดหากข้อ จำกัด ดังกล่าวสามารถนำมาใช้แบบคงที่ (ณ เวลารวบรวม) เพื่อให้การใช้งานในทางที่ผิดทำให้เกิดความล้มเหลวในการรวบรวม
ดังนั้นเมื่อต้องการอาเรย์คำตอบของคำถามต่อไปนี้จะระบุพฤติกรรมของมัน: 1. ขนาดของมันคือ a) ไดนามิกที่รันไทม์หรือ b) คงที่ แต่รู้จักกันเฉพาะที่รันไทม์หรือ c) คงที่และเป็นที่รู้จักในเวลารวบรวม? 2. สามารถจัดสรรอาเรย์บนสแต็กได้หรือไม่?
และจากคำตอบนี่คือสิ่งที่ฉันเห็นว่าเป็นโครงสร้างข้อมูลที่ดีที่สุดสำหรับอาเรย์:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
ใช่ฉันคิดว่าunique_ptr<std::array>
ควรได้รับการพิจารณาและไม่เป็นเครื่องมือสุดท้าย แค่คิดว่าสิ่งที่เหมาะที่สุดกับอัลกอริทึมของคุณ
ทั้งหมดเหล่านี้เข้ากันได้กับ API C ธรรมดาผ่านตัวชี้ดิบไปยังอาร์เรย์ข้อมูล ( vector.data()
/ array.data()
/ uniquePtr.get()
)
ป.ล. นอกเหนือจากข้อควรพิจารณาข้างต้นแล้วยังมีความเป็นเจ้าของอีกอย่างหนึ่ง: std::array
และstd::vector
มีความหมายตามตัวอักษร (มีการสนับสนุนดั้งเดิมสำหรับการคัดลอกและส่งผ่านค่า) ในขณะที่unique_ptr<T[]>
สามารถย้ายได้เท่านั้น (บังคับให้เจ้าของคนเดียว) อาจมีประโยชน์ในสถานการณ์ต่าง ๆ ในทางตรงกันข้ามอาร์เรย์คงที่ธรรมดา ( int[N]
) และอาร์เรย์ไดนามิกธรรมดา ( new int[10]
) เสนอไม่ควรหลีกเลี่ยงหากเป็นไปได้ - ซึ่งควรเป็นไปได้ในกรณีส่วนใหญ่ ถ้านั่นยังไม่เพียงพออาเรย์แบบไดนามิกธรรมดาก็ไม่สามารถสืบค้นขนาดของมันได้ - โอกาสพิเศษสำหรับความเสียหายของหน่วยความจำและช่องโหว่ด้านความปลอดภัย
std::shared_ptr<T[]>
แต่ควรจะมีและอาจจะอยู่ใน C ++ 14 หากใครก็ตามไม่ใส่ใจที่จะเขียนข้อเสนอboost::shared_array
ในเวลาเฉลี่ยที่มีเสมอ