2012-02-23 35 views
6

Trong C++ 11, std :: vector có hàm tạo vector(size_type n) sẽ mặc định xây dựng n các mục tại chỗ, có thể được sử dụng với các lớp cấu hình mặc định, di động, không thể sao chép được.Tại sao không có vector (size_type n, const Allocator & alloc) trong C++ 11?

Tuy nhiên, không giống như tất cả các nhà xây dựng vector khác, không có biến thể mà phải mất một cấp phát, và tôi đã phải dùng đến những điều sau đây:

// Foo is default constructible and moveable, but not copyable 
const int n = 10; // Want 10 default constructed Foos 
std::vector<Foo, CustomAllocator> foos(allocator); 
foos.reserve(n); 
for (int i = 0; i < n; ++i) 
    foos.emplace_back(); 

Có cách nào tốt hơn để thực hiện điều này? Có lý do cụ thể nào vector(size_type n, const Allocator& alloc) bị bỏ qua khỏi tiêu chuẩn không?

+0

Âm thanh như lỗi trong đặc điểm kỹ thuật. Gửi báo cáo về nó, nếu chưa có báo cáo. –

+0

@NicolBolas có tài liệu mô tả quy trình nộp báo cáo không? – rkjnsn

+0

Đừng bận tâm. Xem bài đăng của tôi. –

Trả lời

7

Sau khi suy nghĩ về nó, nó có thể không phải là một khiếm khuyết sau khi tất cả.

Có thể là allocator_typevalue_type là phần châm cùng loại. Trong trường hợp đó, chức năng nào sẽ gọi vector(3, alloc)? Các nhà xây dựng có một giá trị mặc định để sao chép-khởi tạo vào tất cả các yếu tố, hoặc một trong đó có một kích thước và phân bổ một? Đó là mơ hồ, và do đó một lỗi biên dịch.

+0

Yikes! Tôi không nghĩ rằng tôi đã từng nghĩ về điều đó. – rkjnsn

+1

Dễ dàng giải được với ['std :: allocator_arg'] (http://en.cppreference.com/w/cpp/memory/allocator_arg), đã được sử dụng ở những nơi khác (ví dụ:' std :: tuple'). Phiên bản cấp phát sẽ là 'vector (3, std :: allocator_arg, alloc)'. – Xeo

+3

Thư viện chuẩn thường phải tránh sử dụng cùng một số tham số trong quá tải các hàm với các tham số templated. Ví dụ đây là lý do tại sao họ cuối cùng đã không giới thiệu một variadic std :: max và thay vào đó đã đi với một phiên bản mà có một danh sách initializer. Phiên bản variadic sẽ không thể thực hiện theo cách dễ sử dụng trong khi vẫn cho phép so sánh tùy chỉnh. – bames53

6

Thứ nhất, thay vì reserve/loop thingy của bạn, bạn có thể chỉ cần sử dụng resize để đạt được những gì constructor tưởng tượng của bạn sẽ làm gì:

const int n = 10; 
std::vector<Foo, Alloc> foos(allocator); 
foo.resize(n); 

Một lựa chọn khác là sử dụng các phiên bản ba đối số của các nhà xây dựng size_type n:

const int n = 10; 
std::vector<Foo, Alloc> foos(n, Foo(), allocator); 

Mặc dù điều này thực sự sao chép tạo thành các yếu tố có thể hoặc không thể chấp nhận được.

Về lý do? Không ý kiến. Có lẽ bị bỏ qua.

+0

Cảm ơn bạn. Tôi biết tôi phải nhìn một cách dễ dàng hơn. – rkjnsn

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