Array vs Vektor: Pengantar Persamaan dan Perbedaan [closed]

111

Apa perbedaan antara array dan vektor di C ++? Contoh perbedaan mungkin termasuk perpustakaan, simbolisme, kemampuan, dll.

Himpunan

Array berisi sejumlah elemen dari tipe tertentu. Agar kompilator dapat mencadangkan jumlah ruang yang diperlukan saat program dikompilasi, Anda harus menentukan jenis dan jumlah elemen yang akan dimuat dalam larik saat ia didefinisikan. Kompilator harus dapat menentukan nilai ini saat program dikompilasi. Setelah sebuah array ditentukan, Anda menggunakan pengenal untuk array tersebut bersama dengan indeks untuk mengakses elemen tertentu dari array tersebut. [...] array diindeks nol; Artinya, elemen pertama ada di indeks 0. Skema pengindeksan ini menunjukkan hubungan dekat dalam C ++ antara pointer dan array dan aturan yang ditentukan oleh bahasa untuk aritmatika pointer.

- Referensi Saku C ++

Vektor

Vektor adalah urutan objek berukuran dinamis yang menyediakan operator[]akses acak bergaya array . Fungsi anggota push_backmenyalin argumennya melalui konstruktor salinan, menambahkan salinan itu sebagai item terakhir dalam vektor dan menambah ukurannya satu per satu.pop_backmelakukan kebalikannya, dengan menghapus elemen terakhir. Memasukkan atau menghapus item dari akhir vektor membutuhkan waktu konstan diamortisasi, dan memasukkan atau menghapus dari lokasi lain membutuhkan waktu linier. Ini adalah dasar dari vektor. Ada lebih banyak dari mereka. Dalam kebanyakan kasus, vektor harus menjadi pilihan pertama Anda di atas larik gaya C. Pertama-tama, ukurannya dinamis, yang berarti dapat tumbuh sesuai kebutuhan. Anda tidak perlu melakukan segala macam penelitian untuk mengetahui ukuran statis yang optimal, seperti dalam kasus array C; vektor tumbuh sesuai kebutuhan, dan dapat diubah ukurannya lebih besar atau lebih kecil secara manual jika perlu. Kedua, vektor menawarkan pemeriksaan batas dengan atfungsi anggota (tetapi tidak denganoperator[]), sehingga Anda dapat melakukan sesuatu jika Anda mereferensikan indeks yang tidak ada alih-alih hanya menonton program Anda macet atau lebih buruk lagi, melanjutkan eksekusi dengan data yang rusak.

- Buku Resep C ++

Trancot
sumber
Perbedaan paling mendasar: vektor merupakan pilihan yang baik untuk tujuan tertentu.
Jerry Coffin
1
"lengkap" dan "konsise" adalah ortogonal. Artinya, tidak hanya yang satu tidak menyiratkan yang lain, tetapi mereka bahkan tidak pada skala yang sama.
Balapan Ringan di Orbit
2
Saya menjadi sangat kesal pada orang-orang yang memiliki pertanyaan tertutup yang merupakan info yang saya cari. Ini terlalu sering terjadi.
Robert Tamlyn

Jawaban:

142

array:

  • adalah konstruksi bahasa bawaan;
  • datang hampir tidak dimodifikasi dari C89;
  • menyediakan hanya urutan elemen yang berdekatan dan dapat diindeks ; tidak ada bel dan peluit;
  • berukuran tetap; Anda tidak bisa mengubah ukuran array dalam C ++ (kecuali itu adalah array POD dan dialokasikan dengan malloc);
  • ukurannya harus berupa konstanta waktu kompilasi kecuali dialokasikan secara dinamis;
  • mereka mengambil ruang penyimpanannya tergantung dari cakupan tempat Anda mendeklarasikannya;
  • jika dialokasikan secara dinamis, Anda harus secara eksplisit membatalkan alokasinya;
  • jika mereka dialokasikan secara dinamis, Anda hanya mendapatkan sebuah pointer, dan Anda tidak dapat menentukan ukurannya; jika tidak, Anda dapat menggunakan sizeof(karena itu idiom umum sizeof(arr)/sizeof(*arr), yang gagal diam-diam saat digunakan secara tidak sengaja pada pointer);
  • secara otomatis membusuk menjadi petunjuk dalam banyak situasi; khususnya, ini terjadi saat meneruskannya ke suatu fungsi, yang biasanya memerlukan penerusan parameter terpisah untuk ukurannya;
  • tidak bisa dikembalikan dari suatu fungsi;
  • tidak dapat disalin / ditugaskan secara langsung;
  • array dinamis dari objek memerlukan konstruktor default, karena semua elemennya harus dibangun terlebih dahulu;

std::vector:

  • adalah kelas template;
  • adalah konstruksi C ++ saja;
  • diimplementasikan sebagai array dinamis ;
  • tumbuh dan menyusut secara dinamis;
  • secara otomatis mengatur ingatan mereka, yang dibebaskan dari kehancuran;
  • dapat dikirimkan ke / dikembalikan dari fungsi (berdasarkan nilai);
  • dapat disalin / ditetapkan (ini melakukan salinan dalam dari semua elemen yang disimpan);
  • tidak meluruh menjadi pointer, tetapi Anda bisa secara eksplisit mendapatkan pointer ke datanya ( &vec[0]dijamin bekerja seperti yang diharapkan);
  • selalu membawa dengan array dinamis internal ukurannya (berapa banyak elemen yang saat ini disimpan) dan kapasitas (berapa banyak elemen yang dapat disimpan dalam blok yang dialokasikan saat ini);
  • array dinamis internal tidak dialokasikan di dalam objek itu sendiri (yang hanya berisi beberapa bidang "pembukuan"), tetapi dialokasikan secara dinamis oleh pengalokasi yang ditentukan dalam parameter template yang relevan; yang default mendapatkan memori dari freestore (yang disebut heap), secara independen dari bagaimana objek aktual dialokasikan;
  • untuk alasan ini, mereka mungkin kurang efisien dibandingkan dengan array "biasa" untuk array lokal yang kecil dan berumur pendek;
  • saat realokasi, objek disalin (dipindahkan, dalam C ++ 11);
  • tidak memerlukan konstruktor default untuk objek yang disimpan;
  • lebih baik diintegrasikan dengan yang disebut STL (ini menyediakan begin()/ end()metode, STL biasa typedef, ...)

Juga pertimbangkan "alternatif modern" untuk array - std::array; Saya sudah menjelaskan dalam jawaban lain perbedaan antara std::vectordan std::array, Anda mungkin ingin melihatnya.

Matteo Italia
sumber
1
Terima kasih, @MatteoItalia. Satu atau dua referensi akan menyenangkan.
Trancot
1
@Trancot: buku C ++ yang bagus bisa digunakan.
Matteo Italia
6
@Trancot: Saya benar-benar tidak dapat memberi Anda referensi yang lebih baik - perbedaan yang disorot dalam posting ini berasal dari banyak bagian berbeda dari Standar, dan lebih dipahami dengan bantuan manual C ++ yang baik.
Matteo Italia
Sebuah contoh dari deskripsi yang begitu luas akan sangat bagus!
carloswm85
26

Saya akan menambahkan bahwa array adalah konstruksi tingkat sangat rendah dalam C ++ dan Anda harus mencoba menjauhi mereka sebanyak mungkin saat "mempelajari tali" - bahkan Bjarne Stroustrup merekomendasikan ini (dia adalah desainer C ++).

Vektor sangat mirip dengan kinerja yang sama seperti array, tetapi dengan banyak fitur kenyamanan dan keselamatan. Anda mungkin akan mulai menggunakan array saat berinteraksi dengan API yang menangani array mentah, atau saat membuat koleksi Anda sendiri.

John Källén
sumber
1
Antarmuka Program Aplikasi: ( en.wikipedia.org/wiki/API ). Ini adalah kumpulan titik masuk ke entitas perangkat lunak (paket, pustaka, sistem operasi). Beberapa API akan memiliki titik masuk seperti strcat (char * dst, char * src), di mana dst dan src diperlakukan sebagai larik karakter (meskipun tanda tangan fungsi menyiratkan petunjuk ke karakter).
John Källén
11

Referensi tersebut cukup banyak menjawab pertanyaan Anda. Sederhananya, panjang vektor bersifat dinamis sedangkan array memiliki ukuran tetap. saat menggunakan array, Anda menentukan ukurannya pada deklarasi:

int myArray[100];
myArray[0]=1;
myArray[1]=2;
myArray[2]=3;

untuk vektor, Anda cukup mendeklarasikannya dan menambahkan elemen

vector<int> myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
...

kadang-kadang Anda tidak akan mengetahui jumlah elemen yang dibutuhkan sehingga vektor akan ideal untuk situasi seperti itu.

Nicolas Brown
sumber