Ada banyak jawaban di sini dan hampir semuanya akan menyelesaikan pekerjaan.
Namun ada beberapa nasihat yang menyesatkan!
Berikut opsinya:
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());
}
Untuk mempersingkat cerita, Metode 4, menggunakan vector :: insert, adalah yang terbaik untuk skenario bsruth.
Berikut beberapa detail berdarah:
Metode 1 mungkin yang paling mudah dipahami. Cukup salin setiap elemen dari array dan dorong ke belakang vektor. Sayangnya, ini lambat. Karena ada loop (tersirat dengan fungsi copy), setiap elemen harus diperlakukan secara individual; tidak ada peningkatan kinerja yang dapat dibuat berdasarkan fakta bahwa kita mengetahui bahwa array dan vektor adalah blok yang berdekatan.
Metode 2 adalah peningkatan kinerja yang disarankan untuk Metode 1; cukup pra-pesan ukuran array sebelum menambahkannya. Untuk array besar, ini mungkin membantu. Namun saran terbaik di sini adalah jangan pernah menggunakan reserve kecuali profil menunjukkan Anda mungkin bisa mendapatkan peningkatan (atau Anda perlu memastikan iterator Anda tidak akan dibatalkan). Bjarne setuju . Kebetulan, saya menemukan bahwa metode ini melakukan paling lambat sebagian besar waktu meskipun aku berjuang untuk secara komprehensif menjelaskan mengapa hal itu teratur secara signifikan lebih lambat dari metode 1 ...
Metode 3 adalah solusi jadul - berikan beberapa C pada masalah ini! Bekerja dengan baik dan cepat untuk jenis POD. Dalam hal ini, pengubahan ukuran harus dipanggil karena memcpy bekerja di luar batas vektor dan tidak ada cara untuk memberi tahu vektor bahwa ukurannya telah berubah. Selain sebagai solusi yang jelek (penyalinan byte!), Ingatlah bahwa ini hanya dapat digunakan untuk jenis POD . Saya tidak akan pernah menggunakan solusi ini.
Metode 4 adalah cara terbaik untuk melakukannya. Artinya jelas, (biasanya) tercepat dan berfungsi untuk objek apa pun. Tidak ada kerugian menggunakan metode ini untuk aplikasi ini.
Metode 5 adalah tweak pada Metode 4 - salin array ke dalam vektor dan kemudian tambahkan. Pilihan bagus - umumnya cepat dan jelas.
Akhirnya, Anda sadar bahwa Anda dapat menggunakan vektor sebagai pengganti array, bukan? Bahkan ketika suatu fungsi mengharapkan array gaya-c Anda bisa menggunakan vektor:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
Harapan yang membantu seseorang di luar sana!