Saya bisa membuat array dan menginisialisasi seperti ini:
int a[] = {10, 20, 30};
Bagaimana cara membuat std::vector
dan menginisialisasikannya dengan cara yang elegan?
Cara terbaik yang saya tahu adalah:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Apakah ada cara yang lebih baik?
c++
vector
stl
initialization
Agnel Kurian
sumber
sumber
tr1::array
berguna karena array biasa tidak menyediakan antarmuka wadah STLJawaban:
Salah satu metode adalah menggunakan array untuk menginisialisasi vektor
sumber
static
atauconst
, namun keduanya membuatnya lebih eksplisit tentang bagaimana ia harus digunakan dan memungkinkan kompiler untuk membuat optimasi tambahan.Jika kompiler Anda mendukung C ++ 11, Anda dapat melakukannya:
Ini tersedia dalam GCC pada versi 4.4 . Sayangnya, VC ++ 2010 tampaknya tertinggal dalam hal ini.
Atau, perpustakaan Boost.Assign menggunakan sihir non-makro untuk memungkinkan yang berikut:
Atau:
Tetapi perlu diingat bahwa ini memiliki beberapa overhead (pada dasarnya,
list_of
membangun distd::deque
bawah kap) sehingga untuk kode kinerja-kritis Anda akan lebih baik melakukan seperti kata Yacoby.sumber
this->vect = {};
:?std::vector<T> vector;
std::vector<int> v = {1, 2, 3, 4};
, vektorinitializer list constructor
akan dipanggil untuk inisialisasi semacam ini, dokumennya dapat ditemukan diC++ 11
bagian ini .Jika Anda bisa, gunakan cara C ++ modern [11,14,17, ...]:
Cara lama pengulangan pada array panjang variabel atau menggunakan
sizeof()
benar-benar mengerikan di mata dan benar-benar tidak perlu dalam hal overhead mental. Yuck.sumber
Dalam C ++ 0x Anda akan dapat melakukannya dengan cara yang sama seperti yang Anda lakukan dengan array, tetapi tidak dalam standar saat ini.
Dengan hanya dukungan bahasa yang dapat Anda gunakan:
Jika Anda dapat menambahkan perpustakaan lain, Anda dapat mencoba meningkatkan :: tugas:
Untuk menghindari hardcoding ukuran array:
sumber
int another[size_of_array(array)]
selagi dapat melakukannyaint another[ARRAY_SIZE(array)]
.sizeof
ekspresi yang tidak memerlukan definisi. Meskipun Anda benar-benar dapat memberikan definisi, untuk melakukannya dengan benar akan membutuhkan alokasi statis array dan mengembalikan referensi ke sana, dan pertanyaan berikutnya adalah apa yang masuk akal sebagai nilai untuk array? (Perhatikan juga bahwa ini berarti satu array per jenis / ukuran kombinasi instantiations fungsi!) Karena tidak ada gunanya menggunakannya, saya lebih suka menghindarinya.Dalam C ++ 11:
Menggunakan boost list_of:
Menggunakan boost boost:
STL konvensional:
STL konvensional dengan makro umum:
STL konvensional dengan makro penginisialisasi vektor:
sumber
std::begin
danstd::end
untuk array, sehingga vektor juga dapat diinisialisasi sepertistatic const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));
.Hanya berpikir saya akan melemparkan $ 0,02 saya. Saya cenderung menyatakan ini:
di header utilitas di suatu tempat dan kemudian semua yang diperlukan adalah:
Tapi saya tidak sabar menunggu C ++ 0x. Saya macet karena kode saya juga harus dikompilasi di Visual Studio. Boo.
sumber
const T (&data)[N]
bagian itu? Bagaimana ukuran array dikurangi dalam panggilan AndamakeVector(values)
?Sebelum C ++ 11:
Metode 1 =>
Metode 2 =>
C ++ 11 dan seterusnya di bawah ini juga dimungkinkan
sumber
Dimulai dengan:
Jika Anda tidak memiliki kompiler C ++ 11 dan Anda tidak ingin menggunakan boost:
Jika Anda tidak memiliki kompiler C ++ 11 dan dapat menggunakan boost:
Jika Anda memiliki kompiler C ++ 11:
sumber
Untuk inisialisasi vektor -
dapat dilakukan jika Anda memiliki c ++ 11 compiler.
Selain itu, Anda dapat memiliki larik data dan kemudian gunakan untuk loop.
Terlepas dari ini, ada berbagai cara lain yang dijelaskan di atas menggunakan beberapa kode. Menurut saya, cara-cara ini mudah diingat dan cepat ditulis.
sumber
Cara termudah untuk melakukannya adalah:
sumber
Saya membangun solusi saya sendiri menggunakan
va_arg
. Solusi ini sesuai dengan C ++ 98.Demo
sumber
Jika kompiler Anda mendukung makro Variadic (yang berlaku untuk sebagian besar kompiler modern), maka Anda dapat menggunakan makro berikut untuk mengubah inisialisasi vektor menjadi satu-liner:
Dengan makro ini, Anda dapat menentukan vektor yang diinisialisasi dengan kode seperti ini:
Ini akan membuat vektor int baru bernama my_vector dengan elemen 1, 2, 3, 4.
sumber
Jika Anda tidak ingin menggunakan boost, tetapi ingin menikmati sintaksis like
cukup sertakan potongan kode ini
sumber
((((v+=1),2),3),4),5)
Ini adalah cara kerjanya: Pertama,vector<T> += T
mengembalikan vector_inserter mari kita memanggilnyavi
yang merangkum vektor asli kemudianvi,T
menambahkan T ke vektor asli yangvi
merangkum dan mengembalikannya sendiri sehingga kita bisa melakukannyavi,T
lagi.Dalam C ++ 11:
sumber
vector<int> arr = {10, 20, 30};
.Anda dapat melakukannya menggunakan boost :: assign.
detail di sini
sumber
+=
ada tack pada 1,2,3,4 .. pada akhir nilai, atau apakah menambahkan 1 ke elemen 1, 2 ke elemen 2, 3 ke elemen 3 (seperti sintaks seperti ini seharusnya di MATLAB- seperti bahasa)Pertanyaan duplikat yang lebih baru memiliki jawaban ini oleh Viktor Sehr . Bagi saya, itu kompak, menarik secara visual (sepertinya Anda 'mendorong' nilai-nilai di), tidak memerlukan c ++ 11 atau modul pihak ketiga, dan menghindari menggunakan variabel tambahan (tertulis). Di bawah ini adalah bagaimana saya menggunakannya dengan beberapa perubahan. Saya dapat beralih untuk memperluas fungsi vektor dan / atau va_arg di masa depan.
sumber
Metode di bawah ini dapat digunakan untuk menginisialisasi vektor dalam c ++.
int arr[] = {1, 3, 5, 6}; vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
vector<int>v; v.push_back(1); v.push_back(2); v.push_back(3);
dan seterusnyavector<int>v = {1, 3, 5, 7};
Yang ketiga hanya diizinkan di C ++ 11 dan seterusnya.
sumber
Ada banyak jawaban bagus di sini, tetapi karena saya secara mandiri tiba di saya sendiri sebelum membaca ini, saya pikir saya akan melemparkan milik saya di sini ...
Berikut adalah metode yang saya gunakan untuk ini yang akan bekerja secara universal di seluruh kompiler dan platform:
Buat struct atau kelas sebagai wadah untuk koleksi objek Anda. Tetapkan fungsi kelebihan operator untuk <<.
Anda dapat membuat fungsi yang menggunakan struct Anda sebagai parameter, misalnya:
Kemudian, Anda dapat memanggil fungsi itu, seperti ini:
Dengan begitu, Anda dapat membangun dan meneruskan koleksi objek berukuran dinamis ke fungsi dalam satu baris bersih!
sumber
Jika Anda menginginkan sesuatu dengan urutan umum yang sama dengan Boost :: assign tanpa membuat dependensi pada Boost, berikut ini setidaknya secara samar-samar serupa:
Meskipun saya berharap sintaks untuk menggunakannya lebih bersih, itu masih tidak terlalu buruk:
sumber
Untuk mengkompilasi penggunaan:
sumber
sumber
Jika arraynya adalah:
sumber
Sangat mudah untuk membuat inline vektor tanpa mendefinisikan variabel saat menulis tes, misalnya:
sumber
Terkait, Anda dapat menggunakan yang berikut ini jika Anda ingin memiliki vektor yang benar-benar siap untuk masuk dalam pernyataan cepat (misalnya segera beralih ke fungsi lain):
contoh fungsi
contoh penggunaan
meskipun hati-hati tentang jenis deklarasi, pastikan nilai pertama jelas apa yang Anda inginkan.
sumber
Ada berbagai cara untuk meng-hardcode suatu vektor, saya akan membagikan beberapa cara:
sumber
"Bagaimana cara membuat vektor STL dan menginisialisasi seperti di atas? Apa cara terbaik untuk melakukannya dengan upaya mengetik minimum?"
Cara termudah untuk menginisialisasi vektor saat Anda menginisialisasi larik bawaan Anda menggunakan daftar penginisialisasi yang diperkenalkan di C ++ 11 .
ivec adalah 3 elemen dalam ukuran setelah Penugasan (pernyataan berlabel) dieksekusi.
sumber
B. Stroustrup menjelaskan cara yang bagus untuk melakukan operasi rantai di 16.2.10 Selfreference pada halaman 464 dalam edisi C ++ 11 dari Prog. Lang. di mana fungsi mengembalikan referensi, di sini diubah menjadi vektor. Dengan cara ini Anda dapat rantai seperti
v.pb(1).pb(2).pb(3);
tetapi mungkin terlalu banyak bekerja untuk keuntungan kecil.sumber
Cara paling sederhana, lebih ergonomis (dengan C ++ 11 atau lebih baru):
sumber
Jika Anda ingin memilikinya di kelas Anda sendiri:
sumber