std::vector
là một lớp mẫu đóng gói một mảng động 1 , được lưu trữ trong heap, tự động phát triển và co lại nếu các phần tử được thêm hoặc xóa. Nó cung cấp tất cả các hook ( begin()
,, end()
iterators, v.v.) làm cho nó hoạt động tốt với phần còn lại của STL. Nó cũng có một số phương thức hữu ích cho phép bạn thực hiện các thao tác trên một mảng bình thường sẽ cồng kềnh, chẳng hạn như chèn các phần tử vào giữa một vectơ (nó xử lý tất cả công việc di chuyển các phần tử sau trong hậu trường).
Vì nó lưu trữ các phần tử trong bộ nhớ được phân bổ trên heap, nó có một số chi phí liên quan đến mảng tĩnh.
std::array
là một lớp mẫu đóng gói một mảng có kích thước tĩnh, được lưu trữ bên trong chính đối tượng, điều đó có nghĩa là, nếu bạn khởi tạo lớp trên ngăn xếp, thì chính mảng đó sẽ nằm trên ngăn xếp. Kích thước của nó phải được biết tại thời điểm biên dịch (nó được truyền dưới dạng tham số mẫu) và nó không thể tăng hoặc thu hẹp.
Nó hạn chế hơn std::vector
, nhưng nó thường hiệu quả hơn, đặc biệt là đối với các kích thước nhỏ, vì trong thực tế, nó chủ yếu là một lớp bao bọc nhẹ xung quanh một mảng kiểu C. Tuy nhiên, nó an toàn hơn, vì chuyển đổi ngầm thành con trỏ bị vô hiệu hóa và nó cung cấp nhiều chức năng liên quan đến STL của std::vector
và các container khác, vì vậy bạn có thể sử dụng dễ dàng với thuật toán & đồng STL. Nhưng dù sao, đối với giới hạn của kích thước cố định, nó kém linh hoạt hơn nhiều std::vector
.
Để giới thiệu về std::array
, hãy xem bài viết này ; để giới thiệu nhanh về std::vector
và các hoạt động có thể có trên đó, bạn có thể muốn xem tài liệu của nó .
Trên thực tế, tôi nghĩ rằng trong tiêu chuẩn, chúng được mô tả về độ phức tạp tối đa của các hoạt động khác nhau (ví dụ: truy cập ngẫu nhiên trong thời gian không đổi, lặp lại tất cả các yếu tố trong thời gian tuyến tính, thêm và loại bỏ các yếu tố ở cuối thời gian khấu hao không đổi, v.v.), nhưng AFAIK không có phương pháp nào khác để đáp ứng các yêu cầu đó ngoài việc sử dụng một mảng động. Như @Lucretiel đã nêu, tiêu chuẩn thực sự yêu cầu các phần tử được lưu trữ liên tục, do đó, nó là một mảng động, được lưu trữ trong đó bộ cấp phát liên quan đặt nó.
std::vector
vớistd::array
và các điều khoản khác nhau như thế nào.