2016-01-04 14 views
5

Có cách nào để xây dựng std::vector<C> của các phần tử N bằng cách gọi hàm tạo mặc định cho mỗi phần tử không?Gọi hàm khởi tạo mặc định cho mỗi phần tử trong std được xây dựng :: vector

Hàm tạo từ size_type chỉ cần gọi hàm tạo C một lần và sau đó sử dụng hàm tạo bản sao của nó cho phần còn lại của phần tử.

+2

Ông có thể làm rõ cho dù bạn đang bị mắc kẹt với C++ 03? Nếu không, thì không có vấn đề gì để giải quyết. – juanchopanza

+0

Thật vậy, tôi đã sử dụng GNU C++ mặc định của GNU C++ stdlib (mặc định cho các mục tiêu triển khai cũ ít nhất), bao gồm phiên bản cũ hơn của std :: vector. Với stdlib LLVM của thực sự không có vấn đề. – Danra

+0

Nếu bạn đặt '-std = C++ 11' thì stdlib cũng nên làm điều đúng, trừ khi nó rất cũ. – juanchopanza

Trả lời

5

Phương thức khởi tạo từ size_type chỉ gọi hàm tạo của C một lần và rồi sử dụng hàm tạo bản sao cho phần còn lại của các phần tử.

Không đúng kể từ C++11. Nhìn vào std::vector::vector documentation:

...

vector (count size_type, const T & giá trị, const cấp phát & alloc = cấp phát()); (2)

vector rõ ràng (số lượng size_type, const Allocator & alloc = Allocator()); (3)

...

Và sau đó:

...

2) cấu trúc container với bản số của các yếu tố có giá trị giá trị .

3) Xây dựng vùng chứa có số lượng được chèn vào mặc định trường hợp của T. Không có bản sao nào được tạo.

...

Vì vậy, bạn cần các nhà xây dựng 3 std::vector<C>(size)


Nó có vẻ như hành vi này chỉ tồn tại kể từ khi c++11.

Tôi không thể tìm thấy cách thực hiện việc này trước c++11. Vì không có hàm tạo nào có thể làm điều này, nên tùy chọn sẽ tạo ra một véc-tơ rỗng, dự trữ và sau đó là các phần tử emplace_back. Nhưng emplace_back là từ c++11 vì vậy ... chúng tôi trở lại hình vuông.

+3

Để công bằng, điều này đã thay đổi giữa C++ 03 và C++ 11 ... –

+0

@KerrekSB không biết rằng – bolov

+0

Vâng. C++ 11 với việc dọn sạch một loạt các thứ như thế. Với mô hình phân bổ hữu ích hơn, nhiều nhà xây dựng cấp phát đã được thêm vào ở mọi nơi và các đối số mặc định đã bị loại bỏ trong cùng một lần giặt, có lẽ là giúp tránh tình trạng quá tải. Trong mọi trường hợp, C++ 11 bây giờ làm cho các đối số mặc định ít liên quan hơn, vì các hàm tạo ủy nhiệm mới cho phép mã người dùng định nghĩa dễ dàng quá tải nhiều hàm tạo (mặc dù trường hợp vectơ không ủy nhiệm). –

3

Chỉ cần làm điều này:

std::vector<C> v(size) 

Ví dụ:

#include <iostream> 
#include <string> 
#include <vector> 
class C{ 
    public: 
    C(){ 
     std::cout << "constructor\n"; 
    } 
    C(C const&){ 
     std::cout << "copy/n"; 
    } 
}; 
int main() 
{ 
    std::vector<C> v(10); 

} 

Kết quả: (C++ 11/14)

constructor 
constructor 
constructor 
constructor 
constructor 
constructor 
constructor 
constructor 
constructor 
constructor 

Kết quả: (C++ 98)

constructor 
copy 
copy 
copy 
copy 
copy 
copy 
copy 
copy 
copy 
copy 

Live Demo

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