Trong C++, có một vài lý do thuyết phục để sử dụng mảng C trên std::vector
. Một trong số ít lý do thuyết phục, ít nhất là với C++ 03, là một thực tế là không thể sử dụng một vectơ để phân bổ một mảng các đối tượng chưa được khởi tạo. Các "lấp đầy" constructor cho std::vector
là:Đối tượng được khởi tạo giá trị trong C++ 11 và std :: constructor vector
vector(size_type count, const T& value = T())
Nghĩa là ...
int* array = new array[1000000];
có khả năng là nhiều hiệu quả hơn:
std::vector<int> v(1000000);
... từ constructor vector sẽ phải zero-initialize mảng các số nguyên. Do đó, khi làm việc với một vectơ POD, không có tương đương thực với malloc
; tốt nhất bạn có thể nhận được là tương đương với calloc
.
C++ 11 dường như đã thay đổi điều này, với khái niệm "khởi tạo giá trị". Trong C++ 11, std::vector
có một hàm tạo mới nhận một giá trị size_type
đơn lẻ, không có đối số mặc định. "Giá trị này khởi tạo" tất cả các phần tử trong vectơ. Tiêu chuẩn C++ 11 phân biệt giữa "khởi tạo giá trị" và "không khởi tạo".
Sự hiểu biết của tôi là "khởi tạo giá trị" tương đương với việc gọi hàm tạo mặc định trên T
. Nếu T
là loại POD như int
, thì hàm tạo mặc định chỉ tạo một số nguyên chưa được khởi tạo. Do đó, trong C++ 11, explicit vector::vector(size_type count)
thực sự tương đương với malloc
nếu T
là POD.
Tuy nhiên, sự hiểu biết của tôi về điều này dựa trên tiêu chuẩn dự thảo C++ 11, chứ không phải tiêu chuẩn cuối cùng.
Câu hỏi: Sự hiểu biết của tôi có chính xác ở đây không? Có phải explicit vector::vector(size_type count)
cung cấp một mảng chưa được khởi tạo (tương tự như malloc
) nếu T
là POD không?
Khởi tạo giá trị nghĩa là khởi tạo zero cho các kiểu tích hợp. – juanchopanza
Nếu bạn muốn lưu trữ uninitialized sau đó sử dụng 'vector :: dự trữ', như mọi khi. – Pubby
@Channel: C++ 03 cũng có giá trị khởi tạo như trái ngược với khởi tạo mặc định và khởi tạo không. Bit duy nhất có liên quan đã thay đổi là 'std :: vector'. –