Saya dapat memahami kapan harus menggunakan daftar, tetapi saya tidak mengerti kapan lebih baik menggunakan vektor daripada menggunakan daftar di video game: kapan lebih baik memiliki akses acak cepat?
(Dan saya mengerti mengapa lebih cepat memasukkan / menghapus daftar karena itu hanya menghilangkan / menambah pointer, tetapi masih harus menemukan item yang sesuai ...)
c++
algorithm
data-structure
jokoon
sumber
sumber
container
.Jawaban:
Aturan praktis saya, dan saya yakin akan ada perdebatan tentang ini, adalah untuk tidak pernah menggunakan daftar (kecuali jika Anda perlu, sangat sering menghapus hal-hal dari tengah daftar besar).
Kecepatan yang akan Anda peroleh dengan memasukkan semua elemen Anda ke dalam wadah dalam memori yang bersebelahan (dan karenanya lebih ramah-cache) sebanding dengan biaya tambahan untuk menambah / menghapus / mengubah ukuran vektor.
Sunting: Hanya untuk memperjelas lebih banyak, tentu saja tidak perlu mengatakan bahwa segala jenis pertanyaan "yang lebih cepat" harus diuji pada platform apa pun dengan set data apa pun yang sesuai dengan kebutuhan khusus Anda. Jika saya hanya perlu koleksi elemen saya hanya menggunakan vektor (atau deque, yang merupakan hal yang hampir sama) kecuali ada alasan bagus untuk tidak melakukannya.
sumber
Gunakan daftar ketika pembatalan iterator yang disebabkan oleh memodifikasi bagian tengah struktur data Anda akan menyebabkan masalah, atau Anda perlu menjaga elemen Anda diurutkan sehingga swap dan pop trick untuk penghapusan koleksi menengah cepat tidak akan berfungsi dan Anda memiliki besar jumlah koleksi pertengahan dihapus.
Anda mungkin juga ingin mempertimbangkan untuk menggunakan Deque. Ini memiliki karakteristik kinerja yang mirip dengan vektor tetapi tidak memiliki kebutuhan vektor untuk memori yang berdekatan, dan sedikit lebih fleksibel.
sumber
Pilihan Anda harus mencerminkan kebutuhan Anda. Semua elemen vektor terus-menerus dalam memori dan daftar memiliki petunjuk ke elemen berikutnya / sebelumnya sehingga masing-masing memiliki kelebihan / kekurangan:
Daftar:
Vektor:
Jadi daftar lebih baik ketika program Anda perlu menambah dan menghapus elemen sering, tetapi tidak pernah mengakses (atau jarang mengakses) elemen tertentu tanpa perlu yang lain sebelumnya. Vektor harus digunakan untuk waktu akses yang lebih baik, tetapi tidak memiliki efisiensi ketika Anda perlu menghapus atau menambahkan elemen.
Lihat posting ini di stackoverflow, ini menyajikan grafik yang sangat bagus dengan pertanyaan dasar tentang kebutuhan Anda yang mengarahkan Anda ke wadah tertentu tergantung pada jawaban Anda:
/programming/366432/extending-stdlist
sumber
Biasanya daftar digunakan untuk struktur seperti antrian di mana ada banyak append dan hapus operasi. Contoh: Daftar entitas yang terus berubah yang harus diperbarui. Daftar itu sendiri hanya berisi entitas di layar dan karenanya sering berubah.
Vektor (atau array) lebih cocok untuk koleksi yang tidak banyak berubah dan di mana Anda membutuhkan akses cepat ke masing-masing item dalam koleksi. Contoh: Peta-ubin tempat Anda harus mencari ubin pada indeks yang diberikan.
Pendapat Tetrads mungkin benar, tetapi itu tergantung pada bahasa pemrograman yang digunakan. Saya melihat bahwa Anda menandai pertanyaan Anda
c++
, tetapi saya mencoba memberikan jawaban yang tidak spesifik bahasa.sumber
Di game konsol kami tidak pernah menggunakan std :: list karena:
even std :: vector kehilangan dukungan pada konsol karena:
sumber
struct point{float x, y, z, w}; std::vector<point> positions;
point
adalah objek C ++ (sebagaimanastd::vector
, sesuatu yang sederhanafloat
). Saya tahu perbedaan yang Anda coba gambar, tetapi Anda melakukan pekerjaan yang buruk untuk menjelaskannya.