Tôi có một std::array<Foo, 10>
và tôi muốn tạo một std::array<Bar, 10>
sử dụng hàm từ Foo
đến Bar
. Thông thường tôi sẽ sử dụng std::transform
như vậy:Cách tạo std :: array với std :: transform mà không có hàm tạo mặc định
array<Bar, 10> bars;
transform(foos.begin(), foos.end(), bars.begin(), [](Foo foo){
return Bar(foo.m_1, foo.m_2);
});
Tuy nhiên, Bar
không có một constructor mặc định, vì vậy tôi không thể tạo ra các mảng bars
. Tôi luôn có thể sử dụng vector
nhưng nó sẽ là tốt đẹp để có thể sử dụng array
để đảm bảo rằng tôi luôn luôn có chính xác 10 yếu tố. Điều đó có thể không?
Bạn có thể sử dụng một cái gì đó như [chưa hoàn toàn] (https://www.reddit.com/r/cpp/comments/1njair/stdoptional_and_stddynarray_removed_from_c14_and/) -std [std :: tùy chọn] (https://github.com/akrzemi1/Optional) để bọc thanh cho các mục đích của mảng này. Ít nhất thì điều đó sẽ không buộc Bar có một hàm tạo mặc định nói chung, và nó có ích bao gồm trong một dự án nào đó (imo). – HostileFork
Có phải 'vectơ.reserve (10)' không đủ trong mã của bạn cho kích thước '10' hay bạn muốn đảm bảo mã máy khách cũng không thay đổi kích thước đó? – Niall
Trong trường hợp này 'vector.reserve' hoạt động tốt nhưng không phải là ý tưởng, vì ngữ nghĩa bộ sưu tập này phải có 10 mục và nó sẽ không hoạt động trong mọi trường hợp. Hình ảnh nếu tôi phải chuyển nó đến một hàm chấp nhận một 'std :: array &'. –
Drew