Apa cara termudah untuk mengubah array menjadi vektor?

94

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.

Amir Saniyan
sumber

Jawaban:

140

Gunakan vectorkonstruktor 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 3dalam 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.

Fred Foo
sumber
1
Bisakah Anda menjelaskannya? Saya sudah membaca vector<int> a(5,10);maksud make room for 5 int` dan menginisialisasinya dengan 10. Tapi bagaimana x, x + ... Anda bekerja? bisakah kamu menjelaskan?
Asif Mushtaq
1
@UnKnown daripada memilih vector<int>::vector(size_type, int), ia memilih vector<int>::vector(int*, int*), yang menyalin rentang yang dilambangkan oleh pasangan penunjuk tersebut. Yang pertama kelebihan beban (2), yang kedua kelebihan beban (4) di sini
Caleth
1
Pada c ++ 11 std :: range lebih baik daripada metode sizeof. sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
Isaac Pascual
116

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 });
Dietmar Kühl
sumber
2
apakah itu menyalin array atau hanya menunjuk ke sana? Saya prihatin dengan kinerja
kirill_igum
2
std::vector<T>selalu memiliki Tobjek. 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.
Dietmar Kühl
jadi jika saya ingin antarmuka pustaka c ++ dan ac dan menyalin dari c-array ke vektor dan sebaliknya, tidak ada cara untuk membayar denda 2 salinan? (Saya menggunakan perpustakaan eigen dan gsl)
kirill_igum
16

Pointer dapat digunakan seperti iterator lainnya:

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
Rafał Rawicki
sumber
2
Dalam kehidupan nyata Anda mungkin ingin mengabstraksi ukuran array, misalnya menggunakan const size_t X_SIZE = 3;untuk menunjukkan ukuran array, atau menghitungnya dari sizeof. Saya menghilangkan bagian itu agar mudah dibaca.
Rafał Rawicki
11

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 )

Flexo
sumber
"alih-alih memaksa semuanya menjadi vektor, tanyakan bagaimana Anda dapat mengonversi pengujian untuk bekerja dengan iterator alih-alih penampung tertentu." Mengapa ini lebih baik?
aquirdturtle
1
@aquirdturtle karena sekarang, alih-alih hanya mendukung vektor, Anda mendukung daftar dan larik serta meningkatkan kontainer dan mengubah iterator dan rentang dan ....
Flexo
2
dan Anda tidak perlu menyalin datanya
Lightness Races di Orbit
2

Salah satu cara sederhana dapat menggunakan assign()fungsi yang telah ditentukan sebelumnya di vectorkelas.

misalnya

array[5]={1,2,3,4,5};

vector<int> v;
v.assign(array, array+5); // 5 is size of array.
3251_ali
sumber
2
Setara dengan penggunaan ctor, yang disebutkan dalam jawaban yang ada sekitar tujuh tahun lalu. Tidak menambahkan apa-apa ...
Balapan Lightness di Orbit