Apa cara termudah untuk mengubah array menjadi vektor?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
Saya ingin mengubah x dari int array ke vektor dengan cara yang paling sederhana.
Gunakan vector
konstruktor yang menggunakan dua iterator, perhatikan bahwa pointer adalah iterator yang valid, dan gunakan konversi implisit dari array ke pointer:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);
atau
test(std::vector<int>(x, x + sizeof x / sizeof x[0]));
di mana sizeof x / sizeof x[0]
jelas 3
dalam konteks ini; ini adalah cara umum untuk mendapatkan jumlah elemen dalam sebuah array. Perhatikan bahwa x + sizeof x / sizeof x[0]
poin satu elemen di luar elemen terakhir.
vector<int> a(5,10);
maksudmake room for 5
int` dan menginisialisasinya dengan 10. Tapi bagaimana x, x + ... Anda bekerja? bisakah kamu menjelaskan?vector<int>::vector(size_type, int)
, ia memilihvector<int>::vector(int*, int*)
, yang menyalin rentang yang dilambangkan oleh pasangan penunjuk tersebut. Yang pertama kelebihan beban (2), yang kedua kelebihan beban (4) di sinisizeof x / sizeof x[0] == std::extent<decltype(x)>::value
Secara pribadi, saya sangat menyukai pendekatan C ++ 2011 karena tidak mengharuskan Anda untuk menggunakan
sizeof()
atau mengingat menyesuaikan batas array jika Anda pernah mengubah batas array (dan Anda dapat menentukan fungsi yang relevan di C ++ 2003 jika Anda mau juga. ):#include <iterator> #include <vector> int x[] = { 1, 2, 3, 4, 5 }; std::vector<int> v(std::begin(x), std::end(x));
Jelas, dengan C ++ 2011 Anda mungkin ingin menggunakan daftar penginisialisasi:
std::vector<int> v({ 1, 2, 3, 4, 5 });
sumber
std::vector<T>
selalu memilikiT
objek. Ini memiliki dua implikasi: ketika menyisipkan objek ke dalam vektor, mereka disalin dan ditempatkan di memori. Untuk objek yang cukup kecil, misalnya urutan string pendek, kolokasi adalah keuntungan performa utama. Jika objek Anda besar dan mahal untuk disalin, Anda mungkin ingin menyimpan petunjuk [entah bagaimana terkelola sumber daya] ke objek. Pendekatan mana yang lebih efisien bergantung pada objek tetapi Anda punya pilihan.Pointer dapat digunakan seperti iterator lainnya:
int x[3] = {1, 2, 3}; std::vector<int> v(x, x + 3); test(v)
sumber
const size_t X_SIZE = 3;
untuk menunjukkan ukuran array, atau menghitungnya dari sizeof. Saya menghilangkan bagian itu agar mudah dibaca.Anda menanyakan pertanyaan yang salah di sini - alih-alih memaksa semuanya menjadi vektor, tanyakan bagaimana Anda dapat mengonversi pengujian untuk bekerja dengan iterator alih-alih penampung tertentu. Anda juga dapat memberikan kelebihan beban untuk mempertahankan kompatibilitas (dan menangani penampung lain pada saat yang sama secara gratis):
void test(const std::vector<int>& in) { // Iterate over vector and do whatever }
menjadi:
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)); }
Yang memungkinkan Anda melakukan:
int x[3]={1, 2, 3}; test(x); // Now correct
( Demo Ideone )
sumber
Salah satu cara sederhana dapat menggunakan
assign()
fungsi yang telah ditentukan sebelumnya divector
kelas.misalnya
array[5]={1,2,3,4,5}; vector<int> v; v.assign(array, array+5); // 5 is size of array.
sumber