Tôi không thể không đồng ý với tinh thần của câu trả lời được chấp nhận đủ mạnh. "Một công cụ cuối cùng"? Cách xa nó!
Theo cách tôi thấy, một trong những tính năng mạnh nhất của C ++ so với C và với một số ngôn ngữ tương tự khác là khả năng diễn đạt các ràng buộc để có thể kiểm tra chúng tại thời điểm biên dịch và có thể ngăn chặn việc lạm dụng ngẫu nhiên. Vì vậy, khi thiết kế một cấu trúc, hãy tự hỏi những gì nó nên cho phép hoạt động. Tất cả các mục đích sử dụng khác đều bị cấm và tốt nhất là nếu các hạn chế đó có thể được triển khai tĩnh (tại thời gian biên dịch) để việc sử dụng sai dẫn đến lỗi biên dịch.
Vì vậy, khi một người cần một mảng, các câu trả lời cho các câu hỏi sau chỉ định hành vi của nó: 1. Kích thước của nó là a) động khi chạy, hoặc b) tĩnh, nhưng chỉ được biết khi chạy, hoặc c) tĩnh và được biết tại thời gian biên dịch? 2. Mảng có thể được phân bổ trên ngăn xếp hay không?
Và dựa trên các câu trả lời, đây là cấu trúc dữ liệu tốt nhất cho một mảng như vậy:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
Đúng, tôi nghĩ unique_ptr<std::array>
cũng nên được xem xét, và cũng không phải là một công cụ của phương sách cuối cùng. Chỉ cần nghĩ những gì phù hợp nhất với thuật toán của bạn.
Tất cả những thứ này tương thích với API C đơn giản thông qua con trỏ thô đến mảng dữ liệu ( vector.data()
/ array.data()
/ uniquePtr.get()
).
PS Ngoài những cân nhắc ở trên, còn có một quyền sở hữu: std::array
và std::vector
có ngữ nghĩa giá trị (có hỗ trợ riêng để sao chép và chuyển theo giá trị), trong khi unique_ptr<T[]>
chỉ có thể được di chuyển (thực thi quyền sở hữu duy nhất). Hoặc là có thể hữu ích trong các kịch bản khác nhau. Ngược lại, mảng tĩnh đơn giản ( int[N]
) và mảng động đơn giản ( new int[10]
) không cung cấp và do đó nên tránh nếu có thể - điều này có thể xảy ra trong phần lớn các trường hợp. Nếu điều đó là không đủ, các mảng động đơn giản cũng không cung cấp cách nào để truy vấn kích thước của chúng - cơ hội bổ sung cho các lỗi bộ nhớ và lỗ hổng bảo mật.
std::shared_ptr<T[]>
, nhưng nên có, và có lẽ sẽ có trong C ++ 14 nếu bất cứ ai có thể bị làm phiền để viết một đề xuất. Trong lúc này, luôn luôn cóboost::shared_array
.