2015-03-05 47 views
7

Có loại C++ nào hoạt động như một mảng "có kích thước không thay đổi kích thước động" không? Đây là loại loại có thể được coi như một trong hai điều:Mảng có kích thước không thay đổi kích thước động

  • vector<T> nhưng không resize, push_back vv
  • array<T,N> nhưng nơi N là năng động và không tĩnh.

Tôi không muốn giải pháp chỉ hoạt động nếu loại phần tử trong mảng là loại không thể sao chép được. Tôi muốn một giải pháp chung.

+0

Tại sao bạn cần điều này? Tại sao bạn không thể sử dụng một vector hoặc một mảng? – user463035818

+1

Tôi thích các loại của mình càng chính xác càng tốt. Tôi có kế hoạch sử dụng một số 'vector' nhưng thiết lập kích thước của nó chỉ một lần và sau đó chỉ thay đổi giá trị của nó. Tôi thích nếu tôi có thể tài liệu này thông qua hệ thống kiểu thay vì thông qua một bình luận. – tohava

+0

@Cyber ​​- nhưng tôi không muốn nó chỉ cho các loại giá trị không thể sao chép được, tôi muốn nó cho tất cả các loại. – tohava

Trả lời

22

Có, có (khá nhiều). std::unique_ptr<T[]>. Mẫu tiểu học có chuyên môn hóa một phần cho các trường hợp này, trong đó cung cấp giao diện thích hợp (điều hành [], không điều hành * vv)

Ngoài ra, bạn có thể bọc std::vector trong lớp học của riêng bạn và hạn chế giao diện của nó. Bạn thậm chí có thể làm điều đó bằng cách bắt nguồn từ một lớp std::vector sử dụng thừa kế ngoài công lập và xuất bản chỉ các bộ phận có liên quan của giao diện của nó:

template <class T, class A = std::allocator<T>> 
struct FixedVector : private std::vector<T, A> 
{ 
    using FixedVector::vector::vector; 
    using FixedVector::vector::operator=; 
    using FixedVector::vector::get_allocator; 
    using FixedVector::vector::at; 
    using FixedVector::vector::front; 
    using FixedVector::vector::back; 
    using FixedVector::vector::data; 
    using FixedVector::vector::begin; 
    using FixedVector::vector::cbegin 
    using FixedVector::vector::end; 
    using FixedVector::vector::cend; 
    using FixedVector::vector::empty; 
    using FixedVector::vector::size; 
    using FixedVector::vector::operator[]; 
}; 
+2

Sửa tôi nếu tôi sai, nhưng điều này cần phải là một 'const' bởi vì nếu không ai đó có thể thay thế con trỏ. Đúng? 'Const' cho phép điều này thực sự hoạt động như một vector có thể thay đổi kích thước một lần và không có gì khác. – tohava

+0

Thủ thuật rất hay với 'using' – tohava

+0

có vẻ như sử dụng' const std :: vector <> 'là giải pháp hiển nhiên – Arvid

Các vấn đề liên quan