2010-03-13 50 views
7

này có vẻ đơn giản nhưng tôi bối rối: Con đường tôi tạo ra một vector của trăm, nói, int s lànào constructor của std :: vector được sử dụng trong trường hợp này

std::vector<int> *pVect = new std::vector<int>(100); 

Tuy nhiên, nhìn vào std: : vector documentation Tôi thấy rằng hàm tạo của nó có dạng là

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

Vì vậy, cách trước đó hoạt động? Có phải new gọi hàm tạo với giá trị khởi tạo thu được từ hàm tạo mặc định không? Nếu trường hợp đó xảy ra, thì

std::vector<int, my_allocator> *pVect = new std::vector<int>(100, my_allocator); 

nơi tôi vượt qua người cấp phát của riêng mình, cũng hoạt động?

+0

Ngoài ra, nó sẽ là tuyệt vời nếu bạn có thể đề xuất một nguồn tài nguyên trực tuyến bao gồm các khía cạnh của 'new' và ctors. Cảm ơn. – recipriversexclusion

+0

Xin lỗi, tôi không thể nhận được những gì 'mới' đã làm với câu hỏi của bạn. – AraK

+0

Về cơ bản, những gì tôi đang tự hỏi là: không 'mới' chỉ gọi ctor? Nhưng trong trường hợp này, không có ctor ở dạng đó. – recipriversexclusion

Trả lời

14

Bạn đang làm tất cả sai. Chỉ cần tạo nó làm đối tượng tự động nếu tất cả những gì bạn cần là một vectơ trong phạm vi và thời gian hiện tại

std::vector<int> pVect(100); 

Hàm tạo có đối số mặc định cho tham số thứ hai và thứ ba. Vì vậy, nó được gọi chỉ với một int. Nếu bạn muốn vượt qua một cấp phát riêng, bạn phải vượt qua một đối số thứ hai kể từ khi bạn có thể không chỉ bỏ qua nó

std::vector<int, myalloc> pVect(100, 0, myalloc(some_params)); 

Một ví dụ điển chuyên dụng có thể làm sáng tỏ vấn đề này

void f(int age, int height = 180, int weight = 85); 

int main() { 
    f(25); // age = 25, height and weight taken from defaults. 
    f(25, 90); // age=25, height = 90 (oops!). Won't pass a weight! 
    f(25, 180, 90); // the desired call. 
} 
+0

Câu hỏi của tôi chính xác: Tại sao bạn bỏ qua đối số thứ hai trong trường hợp đầu tiên chứ không bỏ qua ? Tại sao ctor không xử lý giá trị thứ hai như nó đã làm trong trường hợp đầu tiên? – recipriversexclusion

+0

@recipriversexclusion: Tham số thứ hai và thứ ba có các đối số mặc định để bạn có thể gọi hàm tạo với một, hai, _or_ ba đối số. Nếu bạn muốn chuyển đối số cho tham số thứ ba, bạn cũng cần chuyển đối số cho tham số thứ hai (trình biên dịch khác biết rằng bạn có nghĩa là "bỏ qua tham số thứ hai và đưa giá trị này cho tham số thứ ba?"). –

+0

@recip vì nó sẽ không tự mình đưa ra quyết định tùy ý. Đối số đi qua các công trình bằng cách cân bằng các vị trí của đối số và tham số, không phải bằng cách đánh đồng các loại của chúng. Hãy tưởng tượng rằng bạn tạo một vectơ 'float', và phân bổ của bạn có thể được tạo bởi một int (chuyển đổi). Sau đó, trong 'vector v (10, 5)' trình biên dịch không thể chỉ nói "thay vì truyền 5 đến tham số thứ hai làm giá trị mặc định của 10 phần tử để tạo, tôi sẽ chuyển nó tới tham số thứ ba, chuyển đổi nó thành một cấp phát ". Điều đó sẽ không hoạt động. Làm thế nào bạn có thể nêu rõ mong muốn của bạn sau đó? –

6

Để (có lẽ) làm rõ:

Để tạo một đối tượng vector gọi là v 100 yếu tố:

std::vector <int> v(100); 

này sử dụng constructor vector mà có kích thước (100) là tham số đầu tiên. Để tạo vectơ được phân bổ động của 100 phần tử:

std::vector <int> * p = new std::vector<int>(100); 

sử dụng chính xác cùng một hàm tạo.

+0

Cảm ơn, bài đăng gốc của tôi đã hơi bị cắt xén, sửa lỗi đó ngay bây giờ. Câu hỏi của tôi là: làm thế nào để tôi biết rằng các thông số thứ ba khác của constructor teh có thể được bỏ qua, bởi vì ctor vector thực sự có ba tham số? Và, tại sao OK để bỏ qua các đối số thứ 2 và thứ 3 (mặc định được sử dụng) nhưng không phải là chỉ số thứ hai? Cảm ơn. – recipriversexclusion

+0

Các thông số này CÓ THỂ bỏ qua do "cấu trúc tham số mặc định": const T & value = T(), const Allocator & = Allocator() –

0

Bạn đang tạo một vector của hàng trăm yếu tố. Như bạn có thể thấy trong các mẫu mã thứ hai bạn được đăng:

vector rõ ràng (size_type n, const T & value = T(), const cấp phát & = cấp phát());

constructor này có số lượng các yếu tố để đưa vào vectorvalue đó sẽ được chèn vào vector n lần. Nếu bạn không chỉ định value a value được tạo bằng cách sử dụng hàm tạo mặc định của loại véc tơ T. Ở đây nó sẽ là "mặc định" constructor của int mà khởi tạo nó đến 0 (không có điều như là một constructor mặc định của int, tuy nhiên C + + tiêu chuẩn nói rằng int được khởi tạo 0 trong trường hợp này).

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