Đã có nhiều câu trả lời ở đây và chỉ về tất cả chúng sẽ hoàn thành công việc.
Tuy nhiên có một số lời khuyên sai lệch!
Dưới đây là các tùy chọn:
vector<int> dataVec;
int dataArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
unsigned dataArraySize = sizeof(dataArray) / sizeof(int);
// Method 1: Copy the array to the vector using back_inserter.
{
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 2: Same as 1 but pre-extend the vector by the size of the array using reserve
{
dataVec.reserve(dataVec.size() + dataArraySize);
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 3: Memcpy
{
dataVec.resize(dataVec.size() + dataArraySize);
memcpy(&dataVec[dataVec.size() - dataArraySize], &dataArray[0], dataArraySize * sizeof(int));
}
// Method 4: vector::insert
{
dataVec.insert(dataVec.end(), &dataArray[0], &dataArray[dataArraySize]);
}
// Method 5: vector + vector
{
vector<int> dataVec2(&dataArray[0], &dataArray[dataArraySize]);
dataVec.insert(dataVec.end(), dataVec2.begin(), dataVec2.end());
}
Để cắt ngắn một câu chuyện dài Phương pháp 4, sử dụng vector :: insert, là cách tốt nhất cho kịch bản của bsruth.
Dưới đây là một số chi tiết chính:
Phương pháp 1 có lẽ là dễ hiểu nhất. Chỉ cần sao chép từng phần tử từ mảng và đẩy nó vào mặt sau của vectơ. Than ôi, nó chậm. Bởi vì có một vòng lặp (ngụ ý với chức năng sao chép), mỗi phần tử phải được xử lý riêng lẻ; không có cải tiến hiệu suất nào có thể được thực hiện dựa trên thực tế là chúng ta biết mảng và vectơ là các khối liền kề nhau.
Phương pháp 2 là một cải tiến hiệu suất được đề xuất cho Phương pháp 1; chỉ cần dự trữ trước kích thước của mảng trước khi thêm nó. Đối với mảng lớn, điều này có thể giúp đỡ. Tuy nhiên, lời khuyên tốt nhất ở đây là không bao giờ sử dụng dự trữ trừ khi hồ sơ cho thấy bạn có thể có được một cải tiến (hoặc bạn cần đảm bảo các trình lặp của mình sẽ không bị vô hiệu). Bjarne đồng ý . Tình cờ, tôi thấy rằng phương pháp này thực hiện chậm nhất trong hầu hết thời gian mặc dù tôi đang cố gắng giải thích toàn diện tại sao nó thường chậm hơn đáng kể so với phương pháp 1 ...
Phương pháp 3 là giải pháp trường học cũ - ném một số C vào vấn đề! Hoạt động tốt và nhanh chóng cho các loại POD. Trong trường hợp này, thay đổi kích thước được yêu cầu phải được gọi vì memcpy hoạt động bên ngoài giới hạn của vectơ và không có cách nào để nói với vectơ rằng kích thước của nó đã thay đổi. Ngoài việc là một giải pháp xấu xí (sao chép byte!) Hãy nhớ rằng điều này chỉ có thể được sử dụng cho các loại POD . Tôi sẽ không bao giờ sử dụng giải pháp này.
Phương pháp 4 là cách tốt nhất để đi. Nó có nghĩa là rõ ràng, nó (thường) nhanh nhất và nó hoạt động cho bất kỳ đối tượng. Không có nhược điểm nào khi sử dụng phương pháp này cho ứng dụng này.
Phương thức 5 là một tinh chỉnh trên Phương pháp 4 - sao chép mảng vào một vectơ và sau đó nối thêm nó. Tùy chọn tốt - nói chung là nhanh và rõ ràng.
Cuối cùng, bạn biết rằng bạn có thể sử dụng vectơ thay cho mảng, phải không? Ngay cả khi một hàm mong đợi các mảng kiểu c, bạn có thể sử dụng các vectơ:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
Hy vọng rằng sẽ giúp được ai đó ngoài kia!