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::listatau std::dequetidak. Sebuah daftar dapat disisipkan dan dihapus di mana saja, yang tidak seharusnya dilakukan oleh struktur FIFO, dan dequedapat 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::queuehanya 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::listdan std::dequekeduanya 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 listharus 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 dequeharus 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 dequemengalokasikan dalam potongan memori, kemungkinan mengakses elemen dalam penampung ini akan menyebabkan CPU mengembalikan sisa penampungnya juga. Sekarang akses lebih lanjut ke dequeakan 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, dequeseharusnya 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 dequetes dalam satu dan tes listlain untuk benar-benar mengetahui dengan pasti.
Tapi ingat: dapatkan kode yang berfungsi dengan antarmuka yang bersih, lalu khawatirkan performa.
John menimbulkan kekhawatiran bahwa membungkus listatau dequeakan 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 queuedibuat. 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 queuetidak 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.