2012-01-08 55 views

Trả lời

92

Sử dụng các constructor vector mà phải mất hai vòng lặp, lưu ý rằng con trỏ là lặp hợp lệ, và sử dụng các chuyển đổi ngầm từ mảng để con trỏ:

int x[3] = {1, 2, 3}; 
std::vector<int> v(x, x + sizeof x/sizeof x[0]); 
test(v); 

hoặc

test(std::vector<int>(x, x + sizeof x/sizeof x[0])); 

nơi sizeof x/sizeof x[0] rõ ràng là 3 trong ngữ cảnh này; đó là cách chung để nhận số lượng phần tử trong một mảng. Lưu ý rằng x + sizeof x/sizeof x[0] chỉ một phần tử vượt quá phần tử cuối cùng.

+1

Bạn có thể giải thích không? Tôi đã đọc rằng 'vector a (5,10);' có nghĩa là 'tạo chỗ cho 5' int' và khởi tạo chúng với 10. Nhưng cách x, x + ... của bạn hoạt động như thế nào? bạn có thể giải thích? – UnKnown

11

Con trỏ có thể được sử dụng như bất kỳ lặp khác:

int x[3] = {1, 2, 3}; 
std::vector<int> v(x, x + 3); 
test(v) 
+2

Trong cuộc sống thực, bạn có thể muốn trừu tượng ra kích thước mảng, ví dụ bằng cách sử dụng 'const size_t X_SIZE = 3;' để biểu thị kích thước mảng, hoặc tính toán nó từ sizeof. Tôi bỏ qua phần đó vì mục đích dễ đọc. –

77

Cá nhân, tôi rất thích cách tiếp cận C++ 2011 vì nó không đòi hỏi bạn phải sử dụng sizeof() cũng không phải nhớ điều chỉnh giới hạn mảng nếu bạn đã bao giờ thay đổi giới hạn mảng (và bạn có thể xác định các chức năng có liên quan trong C++ 2003 nếu bạn muốn, quá):

#include <iterator> 
#include <vector> 
int x[] = { 1, 2, 3, 4, 5 }; 
std::vector<int> v(std::begin(x), std::end(x)); 

Rõ ràng, với C++ 2011 bạn có thể muốn sử dụng danh sách initializer anyway:

std::vector<int> v({ 1, 2, 3, 4, 5 }); 
+1

hiện nó sao chép mảng hoặc nó chỉ trỏ đến nó? Tôi quan tâm đến hiệu suất –

+1

'std :: vector ' luôn sở hữu đối tượng 'T'. Điều này có hai ý nghĩa: khi chèn đối tượng vào một vector chúng được sao chép và chúng được thu thập trong bộ nhớ. Đối với các đối tượng nhỏ hợp lý, ví dụ: chuỗi các chuỗi ngắn, sự sắp xếp thứ tự là hiệu suất chính. Nếu đối tượng của bạn lớn và đắt tiền để sao chép, bạn có thể muốn lưu trữ con trỏ [bằng cách nào đó được quản lý tài nguyên] vào các đối tượng. Cách tiếp cận nào hiệu quả hơn phụ thuộc vào các đối tượng nhưng bạn có sự lựa chọn. –

+0

vì vậy nếu tôi muốn giao diện một c + + và một thư viện c và sao chép từ c-mảng để vector và trở lại, không có cách nào để trả tiền phạt của 2 bản sao?(Tôi đang sử dụng thư viện eigen và gsl) –

4

Bạn đang đặt câu hỏi sai ở đây - thay vì buộc mọi thứ vào một vectơ hỏi làm cách nào bạn có thể chuyển đổi thử nghiệm để làm việc với các trình vòng lặp thay vì một vùng chứa cụ thể. Bạn có thể cung cấp một quá tải quá nhằm duy trì khả năng tương thích (và xử lý các container khác tại cùng một thời gian miễn phí):

void test(const std::vector<int>& in) { 
    // Iterate over vector and do whatever 
} 

trở thành:

template <typename Iterator> 
void test(Iterator begin, const Iterator end) { 
    // Iterate over range and do whatever 
} 

template <typename Container> 
void test(const Container& in) { 
    test(std::begin(in), std::end(in)); 
} 

Cho phép bạn làm:

int x[3]={1, 2, 3}; 
test(x); // Now correct 

(Ideone demo)

+0

"thay vì buộc mọi thứ vào một vectơ hỏi làm thế nào bạn có thể chuyển đổi thử nghiệm để làm việc với các trình vòng lặp thay vì một vùng chứa cụ thể." Tại sao điều này tốt hơn? – aquirdturtle

+0

@aquirdturtle vì bây giờ, thay vì chỉ hỗ trợ vectơ bạn hỗ trợ danh sách và mảng và tăng container và chuyển đổi vòng lặp và phạm vi và .... – Flexo

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