Pengenalan
Array adalah rangkaian jenis objek yang sama di lokasi memori berturut-turut. Susunan tidak dapat meningkatkan panjang bijih. Vektor seperti susunan, tetapi panjangnya dapat ditingkatkan atau dikurangkan. Oleh itu, vektor mempunyai lebih banyak operasi daripada array.
C ++ mempunyai banyak perpustakaan, semuanya membentuk Perpustakaan Standard C ++. Salah satu perpustakaan ini adalah perpustakaan kontena. Bekas adalah kumpulan objek, dan operasi tertentu dapat dilakukan pada koleksi. Bekas C ++ boleh dikelompokkan menjadi dua set: bekas bekas dan bekas bersekutu. Bekas urutan adalah vektor, susunan (bukan susunan yang sama yang dibincangkan sebelumnya), deque, forward_list, dan list. Ini adalah koleksi yang berbeza (struktur data seperti array), dan masing-masing menawarkan pertukaran yang berbeza.
Mana-mana pengaturcara harus tahu bagaimana memutuskan sama ada menggunakan vektor, array, deque, forward_list atau senarai. Apabila pengaturcara memerlukan struktur yang memerlukan lebih banyak operasi daripada yang berkaitan dengan susunan biasa, susunan biasa tidak boleh digunakan.
Sekiranya tugas itu melibatkan penyisipan dan penghapusan yang kerap di tengah-tengah urutan, maka senarai atau senarai hadapan harus digunakan. Sekiranya tugas itu melibatkan penyisipan dan penghapusan yang kerap pada awal atau akhir urutan, maka deque harus digunakan. Vektor harus digunakan apabila operasi seperti ini tidak diperlukan.
Artikel ini menunjukkan cara menggunakan vektor C ++. Anda memerlukan sedikit pengetahuan mengenai petunjuk, rujukan, dan tatasusunan C ++ untuk memahami artikel ini.
Kelas dan Objek
Kelas adalah sekumpulan pemboleh ubah dan fungsi yang berfungsi bersama, di mana pemboleh ubah tidak mempunyai nilai yang ditetapkan. Apabila nilai diberikan kepada pemboleh ubah, kelas menjadi objek. Nilai yang berbeza yang diberikan kepada kelas yang sama menghasilkan objek yang berbeza; iaitu, objek yang berbeza dapat dari kelas yang sama tetapi mempunyai nilai yang berbeza. Membuat objek dari kelas juga dikenali sebagai membuat objek.
Vektor istilah menggambarkan kelas. Objek yang dibuat dari vektor mempunyai nama yang dipilih oleh pengaturcara.
Fungsi yang tergolong dalam kelas diperlukan untuk membuat objek dari kelas. Dalam C ++, fungsi itu mempunyai nama yang sama dengan nama kelas. Objek berbeza yang dibuat (disusun) dari kelas mempunyai nama berbeza yang diberikan kepada masing-masing oleh pengaturcara.
Membuat objek dari kelas bermaksud membina objek; ia juga bermaksud memberi contoh objek.
Kelas Vektor
Kelas vektor telah ditentukan dan berada di perpustakaan. Untuk menggunakan kelas vektor, pengaturcara mesti memasukkan tajuk vektor dalam fail dengan arahan praprosesan berikut:
#sertakanSetelah tajuk dimasukkan, semua ciri vektor (data anggota dan fungsi anggota) dapat diakses. Untuk menggunakan objek hitungan untuk mengeluarkan data ke terminal (konsol), tajuk objek juga harus disertakan. Untuk menulis program dengan vektor, minimum, tajuk berikut mesti disertakan:
#sertakan#sertakan
Membuat Vektor
int foo [10];Di atas adalah deklarasi larik dengan nama "foo" dan bilangan elemen "10."Ini adalah pelbagai bilangan bulat. Pengisytiharan vektor adalah serupa. Untuk vektor, bilangan elemen adalah pilihan, kerana panjang vektor boleh meningkat atau menurun.
Pada tahap ini dalam program, kelas vektor telah ditentukan di perpustakaan, dan tajuk telah disertakan. Vektor boleh dibuat seperti berikut:
std :: vektorDi sini, vektor adalah fungsi pembina khas. Jenis data yang akan disimpan oleh vektor adalah "int" dalam kurungan sudut. Istilah "vtr" adalah nama yang dipilih oleh pengaturcara untuk vektor. Akhirnya, "8," dalam kurungan, adalah bilangan tentatif bilangan bulat yang dimiliki vektor.
Istilah "std" bermaksud ruang nama standard. Istilah ini mesti diikuti oleh titik dua, dalam konteks ini. Sesiapa sahaja boleh menulis perpustakaan kelas vektor mereka sendiri dan menggunakannya. Namun, C ++ sudah memiliki perpustakaan standard dengan nama standard, termasuk "vektor."Untuk menggunakan nama standard, nama standard mesti didahului oleh std :: . Untuk mengelakkan mengetik std :: setiap kali dalam program untuk nama standard, fail program boleh bermula seperti berikut:
#sertakan#sertakan
menggunakan ruang nama std;
Melebihi Fungsi
Apabila dua atau lebih tandatangan fungsi yang berbeza mempunyai nama yang sama, nama itu dikatakan berlebihan. Apabila satu fungsi dipanggil, bilangan dan jenis argumen menentukan fungsi mana yang dijalankan.
Membina Vektor
Membina vektor bermaksud membuat (membuat) objek vektor. Fungsi konstruktor berlebihan seperti berikut:
vektor
Ini membuat vektor panjang sifar dan taip “T."Pernyataan berikut membuat vektor panjang sifar dari jenis" float "dengan nama" vtr: "
vektorvektor
Ini membuat vektor dengan unsur n jenis "T."Pernyataan untuk vektor ini dengan empat elemen apungan adalah seperti berikut:
vektorvektor
Ini mewujudkan vektor unsur n yang dimulakan kepada nilai t. Pernyataan berikut menghasilkan vektor 5 elemen, di mana setiap elemen mempunyai nilai 3.4:
vektorMembina dengan Permulaan
Vektor boleh dibina (dibuat) dan dimulakan pada masa yang sama, dengan salah satu daripada dua cara berikut:
vektorAtau
vektorPerhatikan bahawa tidak ada tanda kurung setelah nama objek. Tanda kurung yang digunakan tepat setelah nama objek harus mempunyai senarai inisialisasi, seperti berikut:
vektorVektor boleh dibina dan dimulakan kemudian dengan senarai pemula. Dalam kes ini, tanda kurung tidak akan digunakan:
vektorvtr = 1.1, 2.2, 3.3, 4.4;
vektor
Ini adalah pembina salinan. Ia membuat vektor V2 sebagai salinan vektor V1. Kod berikut menggambarkan ini:
vektorvektor
Menetapkan Vektor semasa Pembinaan
Semasa pembinaan, vektor kosong dapat dibuat sementara yang lain ditugaskan kepadanya, seperti berikut:
vektorvektor
Pernyataan kedua bersamaan dengan:
vektorvektor const
Vektor const adalah vektor yang elemennya tidak dapat diubah. Nilai dalam vektor ini hanya boleh dibaca. Semasa dibuat, vektor muncul seperti berikut:
vektor constDalam jenis vektor ini, tidak ada unsur yang dapat ditambahkan atau dikeluarkan. Lebih-lebih lagi, tiada nilai yang dapat diubah.
Membina dengan Iterator
Templat memberikan gambaran umum untuk jenis data. Iterator memberikan gambaran umum pengimbasan melalui nilai-nilai wadah. Sintaks untuk membuat vektor dengan iterator adalah seperti berikut:
templatvektor (InputIterator pertama, InputIterator terakhir, const Allocator & = Allocator ());
Ini membina vektor untuk julat [pertama, terakhir] menggunakan peruntukan yang ditentukan, yang akan dibincangkan kemudian dalam artikel ini.
Menghancurkan Vektor
Untuk menghancurkan vektor, biarkan ia keluar dari ruang lingkup dan menghancurkan ditangani secara automatik.
Kapasiti Vektor
size_type kapasiti () const kecuali
Jumlah elemen yang dapat dipegang oleh vektor tanpa memerlukan pengagihan semula dikembalikan oleh fungsi anggota kapasiti. Segmen kod untuk ini adalah seperti berikut:
vektorint num = vtr.kapasiti ();
cout << num << '\n';
Keluarannya adalah 4.
rizab (n)
Ruang memori tidak selalu tersedia secara bebas. Ruang tambahan boleh ditempah terlebih dahulu. Pertimbangkan segmen kod berikut:
vektorvtr.rizab (6);
cout << vtr.capacity() << '\n';
Keluarannya adalah 6. Jadi, ruang tambahan yang disediakan adalah 6 - 4 = 2 elemen. Fungsi kembali tidak sah.
saiz () const kecuali
Ini mengembalikan bilangan elemen dalam vektor. Kod berikut menggambarkan fungsi ini:
vektorapungan sz = vtr.saiz ();
cout << sz << '\n';
Keluarannya adalah 4.
shrink_to_fit ()
Setelah memberikan kapasiti tambahan kepada vektor dengan fungsi cadangan (), vektor dapat diukur ke bawah agar sesuai dengan ukuran asalnya. Kod berikut menggambarkan ini:
vektorvtr.rizab (6);
vtr.shrink_to_fit ();
int sz = vtr.saiz ();
cout << sz << '\n';
Keluarannya adalah 4 dan bukan 6. Fungsi kembali tidak sah.
ubah saiz (sz), ubah saiz (sz, c)
Ini mengubah saiz vektor. Sekiranya ukuran baru lebih kecil daripada ukuran lama, maka elemen ke arah hujung akan terhapus. Sekiranya ukuran baru lebih panjang, maka beberapa nilai lalai ditambahkan hingga akhir. Untuk mempunyai nilai tambah tertentu, gunakan fungsi resize () dengan dua argumen. Segmen kod berikut menggambarkan penggunaan dua fungsi ini:
vektorvtr1.ubah saiz (2);
cout << "New size of vtr1: " << vtr1.size() << '\n';
vektor
vtr2.ubah saiz (4, 8.8);
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Keluarannya adalah seperti berikut:
Saiz baru vtr1: 2vtr2: 1.1 2.2 8.8 8.8
Fungsi kembali tidak sah.
kosong () const kecuali
Fungsi ini mengembalikan 1 untuk true jika tidak ada unsur dalam vektor dan 0 untuk false jika vektor kosong. Sekiranya vektor mempunyai 4 lokasi untuk jenis data tertentu, seperti float, tanpa nilai float, maka vektor tersebut tidak kosong. Kod berikut menggambarkan ini:
vektorcout << vtr.empty() << '\n';
vektor
cout << vt.empty() << '\n';
vektor
cout << v.empty() << '\n';
Keluarannya adalah seperti berikut:
10
0
Akses Elemen Vektor
Vektor boleh sub-skrip (diindeks) seperti array. Pengiraan indeks bermula dari sifar.
vektorNama [i]
Operasi "vectorName [i]" mengembalikan rujukan ke elemen di iika indeks vektor. Kod berikut mengeluarkan 3.3 untuk vektor di atas:
vektorfloat fl = vtr [2];
cout << fl << '\n';
vektorNama [i] konst
Operasi "vectorName [i] const" dijalankan dan bukannya "vectorName [i]" apabila vektor adalah vektor tetap. Operasi ini digunakan dalam kod berikut:
vektor constfloat fl = vtr [2];
cout << fl << '\n';
Ungkapan mengembalikan rujukan tetap ke iika elemen vektor.
Menetapkan Nilai dengan Langganan
Nilai dapat diberikan kepada vektor tidak tetap, seperti berikut:
vektorvtr [2] = 8.8;
cout << vtr[2] << '\n';
Keluarannya adalah 8.8.
vektorNama.pada (i)
"Nama vektor.di (i) "seperti" vectorName [i], "tetapi" vectorName.di (i) ”lebih dipercayai. Kod berikut menunjukkan bagaimana vektor ini harus digunakan:
vektorfloat fl = vtr.pada (2);
cout << fl << '\n';
di () adalah fungsi anggota vektor.
vektorNama.di (i) konst
"Nama vektor.di (i) const "adalah seperti" vectorName [i] const ", tetapi" vectorName.di (i) const ”lebih dipercayai. "Nama vektor.di (i) const "dijalankan bukan" vectorName.di (i) ”apabila vektor adalah vektor tetap. Vektor ini digunakan dalam kod berikut:
vektor constfloat fl = vtr.pada (2);
cout << fl << '\n';
di () const adalah fungsi anggota vektor.
Menetapkan Nilai dengan Fungsi at ()
Nilai dapat diberikan kepada vektor tidak tetap dengan fungsi at (), seperti berikut:
vektorvtr.pada (2) = 8.8;
cout << vtr[2] << '\n';
Keluarannya adalah 8.8.
Masalah dengan Sub-Skrip
Masalah dengan sub-skrip (pengindeksan) adalah bahawa jika indeks berada di luar jangkauan, sifar dapat dikembalikan atau kesalahan mungkin dikeluarkan pada waktu berjalan.
depan ()
Ini mengembalikan rujukan ke elemen pertama vektor tanpa membuang elemen tersebut. Keluaran kod berikut adalah 1.1.
vektorfloat fl = vtr.depan ();
cout << fl << '\n';
Elemen tidak dikeluarkan dari vektor.
depan () konst
Apabila pembinaan vektor didahului oleh const, ungkapan "depan () const" dijalankan dan bukannya "depan ()."Ini digunakan dalam kod berikut:
vektor constfloat fl = vtr.depan ();
cout << fl << '\n';
Rujukan tetap dikembalikan. Elemen tidak dikeluarkan dari vektor.
belakang ()
Ini mengembalikan rujukan ke elemen terakhir vektor tanpa membuang elemen tersebut. Keluaran kod berikut adalah 4.4.
vektorfloat fl = vtr.belakang ();
cout << fl << '\n';
belakang () konst
Apabila pembinaan vektor didahului oleh const, ungkapan "back () const" dijalankan bukan "back ()."Ini digunakan dalam kod berikut:
vektor constfloat fl = vtr.belakang ();
cout << fl << '\n';
Rujukan tetap dikembalikan. Elemen tidak dikeluarkan dari vektor.
Akses Data Vektor
data () kecuali; data () const kecuali;
Salah satu daripada ini mengembalikan penunjuk sehingga [data (), data () + ukuran ()) adalah julat yang sah.
Perkara ini akan dibahas dengan lebih terperinci kemudian dalam artikel.
Mengembalikan Iterator dan Vektor
Iterator adalah seperti penunjuk tetapi mempunyai lebih banyak fungsi daripada penunjuk.
bermula () kecuali
Mengembalikan iterator yang menunjukkan elemen vektor pertama, seperti pada segmen kod berikut:
vektorvektor
cout << *iter << '\n';
Keluarannya adalah 1.1. Perhatikan bahawa deklarasi yang menerima iterator telah diisytiharkan. Iterator diredferensikan dalam ungkapan kembali untuk mendapatkan nilai dengan cara yang sama seperti penunjuk.
bermula () const kecuali;
Mengembalikan iterator yang menunjukkan elemen vektor pertama. Apabila pembinaan vektor didahului oleh const, ungkapan "begin () const" dijalankan dan bukannya "begin ()."Dalam keadaan ini, elemen yang sesuai dalam vektor tidak dapat diubah. Ini digunakan dalam kod berikut:
vektor constvektor
cout << *iter << '\n';
Keluarannya adalah 1.1. Perhatikan bahawa "const_iterator" telah digunakan kali ini dan bukan hanya "iterator" untuk menerima iterator yang dikembalikan.
akhir () kecuali
Mengembalikan lelaran yang menunjukkan tepat di luar elemen terakhir vektor. Pertimbangkan segmen kod berikut:
vektorvektor
cout << *iter << '\n';
Keluarannya adalah 0, yang tidak bermakna, kerana tidak ada unsur konkrit melebihi elemen terakhir.
akhir () const kecuali
Mengembalikan lelaran yang menunjukkan tepat di luar elemen vektor terakhir. Apabila pembinaan vektor didahului oleh "const", ungkapan "end () const" dijalankan dan bukannya "end ().Pertimbangkan segmen kod berikut:
vektor constvektor
cout << *iter << '\n';
Keluarannya adalah 0. Perhatikan bahawa "const_iterator" telah digunakan kali ini dan bukan hanya "iterator" untuk menerima iterator yang dikembalikan.
Pengulangan Berbalik
Ada kemungkinan untuk mempunyai iterator yang berulang dari akhir hingga sebelum elemen pertama.
rbegin () kecuali
Mengembalikan iterator yang menunjukkan elemen vektor terakhir, seperti pada segmen kod berikut:
vektorvektor
cout << *rIter << '\n';
Keluarannya adalah 4.4.
Perhatikan bahawa deklarasi yang menerima iterator terbalik telah diisytiharkan. Iterator dereferensikan dalam ungkapan kembali untuk mendapatkan nilai dengan cara yang sama seperti penunjuk.
rbegin () const kecuali;
Mengembalikan iterator yang menunjukkan elemen vektor terakhir. Apabila pembinaan vektor didahului oleh "const", ungkapan "rbegin () const" dijalankan bukan "rbegin ()."Dalam keadaan ini, elemen yang sesuai dalam vektor tidak dapat diubah. Ciri ini digunakan dalam kod berikut:
vektor constvektor
cout << *rIter << '\n';
Keluarannya adalah 4.4.
Perhatikan bahawa const_reverse_iterator telah digunakan pada masa ini, dan bukan hanya_balik_iterator, untuk menerima iterator yang dikembalikan.
rend () kecuali
Mengembalikan iterator yang menunjukkan tepat sebelum elemen vektor pertama. Pertimbangkan segmen kod berikut:
vektorvektor
cout << *rIter << '\n';
Keluarannya adalah 0, yang tidak bermakna, kerana tidak ada unsur konkrit sebelum elemen pertama.
rend () const kecuali
Mengembalikan iterator yang menunjukkan tepat sebelum elemen vektor pertama. Ketika konstruksi vektor didahului oleh "const", ekspresi "rend () const" dijalankan bukan "rend ().Pertimbangkan segmen kod berikut:
vektor constvektor
cout << *rIter << '\n';
Keluarannya adalah 0.
Perhatikan bahawa const_reverse_iterator telah digunakan pada masa ini, dan bukannya sebaliknya_iterator, untuk menerima iterator yang dikembalikan.
Pengubah Vektor
Pengubah yang mengubah vektor boleh mengambil atau mengembalikan iterator.
a.tempat kerja (p, args)
Memasukkan objek jenis T yang dibina dengan std :: maju
masukkan (iteratorPosition, nilai)
Memasukkan salinan nilai pada kedudukan iterator vektor. Mengembalikan iterator (kedudukan) dalam vektor tempat salinan telah diletakkan. Kod berikut menunjukkan di mana nilai tersebut diletakkan:
vektorvektor
++iter;
++iter;
vtr.masukkan (iter, 25);
cout << vtr[1] << " << vtr[2]<< '
' << vtr[3] << '\n';
Keluarannya ialah: 20 25 30.
Perhatikan bahawa iterator maju (bertambah) seperti penunjuk.
Senarai pemula juga boleh disisipkan, seperti yang ditunjukkan oleh kod berikut:
vektorvektor
++iter;
++iter;
vtr.masukkan (iter, 25, 28);
cout << vtr[1] << " << vtr[2]<< '
' << vtr[3]<< " << vtr[4] << '\n';
Keluarannya ialah: 20 25 28 30.
padam (kedudukan)
Mengeluarkan elemen pada kedudukan yang ditunjukkan oleh iterator, kemudian mengembalikan kedudukan iterator. Kod berikut menggambarkan ini:
vektorvektor
++iter;
++iter;
vtr.padam (iter);
cout << vtr[0] << " << vtr[1] << '
' << vtr[2]<< '\n';
Keluarannya ialah: 10 20 40
push_back (t), push_back (rv)
Digunakan untuk menambahkan elemen tunggal di hujung vektor. Gunakan push_back (t) seperti berikut:
vektorvtr.tolak_balik (5.5);
float fl = vtr [4];
cout << fl << '\n';
Keluarannya adalah 5.5.
push_back (rv): - lihat kemudian.pop_back ()
Mengeluarkan elemen terakhir tanpa mengembalikannya. Ukuran vektor dikurangkan sebanyak 1. Kod berikut menggambarkan ini:
vektorvtr.pop_back ();
apungan sz = vtr.saiz ();
cout << sz << '\n';
Keluarannya adalah 3.
a.pertukaran (b)
Dua vektor boleh ditukar, seperti yang digambarkan dalam segmen kod berikut:
vektorvektor
vtr1.pertukaran (vtr2);
cout << "vtr1: "<< vtr1[0] <<" "<< vtr1[1] <<"
"<< vtr1[2] <<" "<< vtr1[3] << '\n';
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Keluarannya adalah:
vtr1: 10 20 0 0vtr2: 1.1 2.2 3.3 4.4
Perhatikan bahawa panjang vektor meningkat, jika perlu. Juga, nilai yang tidak mempunyai penggantian digantikan oleh beberapa nilai lalai.
jelas ()
Mengeluarkan semua elemen dari vektor, seperti yang ditunjukkan oleh segmen kod berikut:
vektorvtr.jelas ();
cout << vtr.size() << '\n';
Keluarannya adalah 0.
Pengendali Kesamarataan dan Perhubungan untuk Vektor
Pengendali ==
Mengembalikan 1 untuk true jika kedua-dua vektor mempunyai ukuran yang sama dan elemen yang sama sama jika tidak, ia mengembalikan 0 untuk false. Sebagai contoh:
vektorvektor
bool bl = U == V;
cout << bl << '\n';
Keluarannya adalah 0.
The != Pengendali
Mengembalikan 1 untuk true jika kedua-dua vektor tidak mempunyai ukuran yang sama dan / atau elemen yang sesuai tidak sama; jika tidak, ia mengembalikan 0 untuk false. Sebagai contoh:
vektorvektor
bool bl = U!= V;
cout << bl << '\n';
Keluarannya adalah 1.
The < Operator
Mengembalikan 1 untuk true jika vektor pertama adalah subset awal vektor kedua, dengan unsur-unsur dari dua bahagian yang sama sama dan dalam urutan yang sama. Sekiranya kedua-dua vektor mempunyai ukuran yang sama dan bergerak dari kiri ke kanan dan unsur ditemui pada vektor pertama yang kurang daripada elemen yang sepadan dalam vektor kedua, maka 1 masih akan dikembalikan. Jika tidak, 0 untuk false dikembalikan. Sebagai contoh:
vektorvektor
bool bl = U
Keluarannya adalah 1. < does not include the case when the size and order are the same.
Pengendali>
Pulang !(U < V), where U is the first vector and V is the second vector, according to the above definitions.
The <= Operator
Mengembalikan U <= V, where U is the first vector and V is the second vector, according to the above definitions.
Pengendali> =
Pulang !(U <= V), where U is the first vector and V is the second vector, according to the above definitions.
Kesimpulannya
Vektor adalah contoh bekas turutan. Vektor adalah bentuk yang lebih baik dari tatasusunan biasa dan disusun dari kelas. Vektor mempunyai kaedah yang diklasifikasikan di bawah: pembinaan dan penugasan, kapasiti, akses elemen, akses data, iterator, pengubah, dan operator berangka yang berlebihan.
Terdapat bekas urutan lain, disebut senarai, senarai_ maju, dan tatasusunan. Sekiranya tugas itu melibatkan penyisipan dan penghapusan yang kerap di tengah-tengah urutan, maka senarai atau senarai hadapan harus digunakan. Sekiranya tugas itu melibatkan penyisipan dan penghapusan yang kerap pada awal atau akhir urutan, maka deque harus digunakan. Oleh itu, vektor hanya boleh digunakan apabila operasi seperti ini tidak penting.