Karena ada banyak sekali jawaban, Anda mungkin bingung, tetapi untuk diringkas:
Gunakan a std::queue
. Alasannya sederhana: ini adalah struktur FIFO. Anda menginginkan FIFO, Anda menggunakan file std::queue
.
Itu membuat niat Anda jelas bagi orang lain, dan bahkan diri Anda sendiri. A std::list
atau std::deque
tidak. Sebuah daftar dapat disisipkan dan dihapus di mana saja, yang tidak seharusnya dilakukan oleh struktur FIFO, dan deque
dapat menambah dan menghapus dari kedua ujungnya, yang juga merupakan sesuatu yang tidak dapat dilakukan oleh struktur FIFO.
Inilah mengapa Anda harus menggunakan file queue
.
Sekarang, Anda bertanya tentang kinerja. Pertama, selalu ingat aturan praktis yang penting ini: Kode bagus dulu, performa terakhir.
Alasannya sederhana: orang yang mengupayakan penampilan sebelum kebersihan dan keanggunan hampir selalu menjadi yang terakhir. Kode mereka menjadi omong kosong, karena mereka telah meninggalkan semua yang baik untuk benar-benar mendapatkan apa-apa darinya.
Dengan menulis kode yang bagus dan dapat dibaca terlebih dahulu, sebagian besar masalah kinerja Anda akan teratasi sendiri. Dan jika nanti Anda menemukan kinerja Anda kurang, sekarang mudah untuk menambahkan profiler ke kode Anda yang bagus dan bersih, dan mencari tahu di mana masalahnya.
Itu semua dikatakan, std::queue
hanya adaptor. Ini menyediakan antarmuka yang aman, tetapi menggunakan wadah yang berbeda di dalam. Anda dapat memilih wadah dasar ini, dan ini memungkinkan banyak fleksibilitas.
Jadi, wadah dasar mana yang harus Anda gunakan? Kita tahu bahwa std::list
dan std::deque
keduanya memberikan fungsi yang diperlukan ( push_back()
, pop_front()
, dan front()
), jadi bagaimana kita memutuskan?
Pertama, pahami bahwa mengalokasikan (dan membatalkan alokasi) memori bukanlah hal yang cepat untuk dilakukan, umumnya, karena melibatkan keluar ke OS dan memintanya untuk melakukan sesuatu. A list
harus mengalokasikan memori setiap kali ada sesuatu yang ditambahkan, dan mengalokasikannya ketika hilang.
A deque
, di sisi lain, mengalokasikan dalam potongan. Ini akan mengalokasikan lebih jarang dari a list
. Anggap saja sebagai daftar, tetapi setiap bagian memori dapat menampung banyak node. (Tentu saja, saya menyarankan agar Anda benar-benar mempelajari cara kerjanya .)
Jadi, dengan itu saja a deque
harus berkinerja lebih baik, karena tidak sering berurusan dengan memori. Dicampur dengan fakta Anda menangani data dengan ukuran konstan, mungkin tidak perlu mengalokasikan setelah melewati pertama melalui data, sedangkan daftar akan terus mengalokasikan dan membatalkan alokasi.
Hal kedua yang perlu dipahami adalah kinerja cache . Keluar ke RAM itu lambat, jadi ketika CPU benar-benar membutuhkannya, itu memanfaatkan yang terbaik dari waktu ini dengan mengambil sebagian memori bersamanya, ke dalam cache. Karena a deque
mengalokasikan dalam potongan memori, kemungkinan mengakses elemen dalam penampung ini akan menyebabkan CPU mengembalikan sisa penampungnya juga. Sekarang akses lebih lanjut ke deque
akan lebih cepat, karena datanya ada dalam cache.
Ini tidak seperti daftar, di mana data dialokasikan satu per satu. Ini berarti bahwa data dapat tersebar di semua tempat di memori, dan kinerja cache akan menjadi buruk.
Jadi, mengingat itu, deque
seharusnya menjadi pilihan yang lebih baik. Inilah mengapa ini adalah penampung default saat menggunakan file queue
. Meskipun demikian, ini masih hanya tebakan (sangat) terpelajar: Anda harus membuat profil kode ini, menggunakan deque
tes dalam satu dan tes list
lain untuk benar-benar mengetahui dengan pasti.
Tapi ingat: dapatkan kode yang berfungsi dengan antarmuka yang bersih, lalu khawatirkan performa.
John menimbulkan kekhawatiran bahwa membungkus list
atau deque
akan menyebabkan penurunan kinerja. Sekali lagi, dia dan saya tidak dapat mengatakan dengan pasti tanpa membuat profilnya sendiri, tetapi kemungkinan besar kompilator akan menyebariskan panggilan yang queue
dibuat. Artinya, ketika Anda mengatakan queue.push()
, itu benar-benar hanya akan mengatakan queue.container.push_back()
, melewatkan panggilan fungsi sepenuhnya.
Sekali lagi, ini hanya tebakan, tetapi menggunakan queue
tidak akan menurunkan kinerja, jika dibandingkan dengan menggunakan wadah mentah yang mendasarinya. Seperti yang saya katakan sebelumnya, gunakan queue
, karena bersih, mudah digunakan, dan aman, dan jika benar-benar menjadi profil masalah dan uji.