Karena satu-satunya operasi yang diperlukan agar container digunakan dalam stack adalah:
- kembali()
- push_back ()
- pop_back ()
Mengapa penampung default untuknya adalah deque, bukan vektor?
Jangan deque realokasi memberikan buffer dari elemen sebelum front () sehingga push_front () adalah operasi yang efisien? Bukankah elemen-elemen ini terbuang percuma karena mereka tidak akan pernah digunakan dalam konteks tumpukan?
Jika tidak ada overhead untuk menggunakan deque dengan cara ini dan bukan vektor, mengapa default untuk priority_queue vektor bukan deque juga? (priority_queue membutuhkan front (), push_back (), dan pop_back () - pada dasarnya sama dengan stack)
Diperbarui berdasarkan Jawaban di bawah ini:
Tampaknya cara deque biasanya diimplementasikan adalah larik ukuran variabel dari larik ukuran tetap. Ini membuat pertumbuhan lebih cepat daripada vektor (yang membutuhkan realokasi dan penyalinan), jadi untuk sesuatu seperti tumpukan yang semuanya tentang menambah dan menghapus elemen, deque kemungkinan merupakan pilihan yang lebih baik.
priority_queue sangat membutuhkan pengindeksan, karena setiap penghapusan dan penyisipan mengharuskan Anda menjalankan pop_heap () atau push_heap (). Ini mungkin membuat vektor menjadi pilihan yang lebih baik di sana karena penambahan elemen masih tetap diamortisasi.
sumber
Jawaban:
Saat container berkembang, realokasi untuk vektor memerlukan penyalinan semua elemen ke dalam blok memori yang baru. Mengembangkan deque mengalokasikan blok baru dan menautkannya ke daftar blok - tidak diperlukan salinan.
Tentu saja Anda dapat menentukan bahwa backing container yang berbeda akan digunakan jika Anda mau. Jadi jika Anda memiliki tumpukan yang Anda tahu tidak akan bertambah banyak, beri tahu untuk menggunakan vektor alih-alih deque jika itu pilihan Anda.
sumber
std::deque
daripada sebelumnyastd::vector
, dan operasi ini cenderung lebih sering digunakan daripada realokasi. Saya sulit percaya bahwa itustd::deque
akan pernah mengalahkanstd::vector
dalam latihan.list
, mengapadeque
?std::deque
Anda memiliki kesempatan untuk mengalahkanstd::vector
dalam latihan, atau apakah Anda masih meragukannya? Terima kasih.std::deque
akan dilakukan sebaikstd::vector
dalam aplikasi praktis. Tetapi untuk apa nilainya, pengalaman pribadi saya adalah bahwa saya memerlukan struktur data tumpukan dan antrian bukan untuk satu tugas besar dan kompleksitas-krusial, tetapi untuk banyak kesempatan kecil yang ditaburkan melalui kode saya. Karena itu saya lebih peduli tentang perilaku di kecil daripada di besar; dan deque bersinar sangat membosankan di sana. Preferensi saya adalah menggunakan tidak keduanya, tetapi sebagai gantinya (diterapkan sendiri) daftar tertaut tunggal. Tapi jarak tempuh Anda mungkin berbeda.Lihat Guru Minggu 54 Herb Sutter untuk manfaat relatif vektor dan deque di mana keduanya akan berhasil.
Saya membayangkan ketidakkonsistenan antara priority_queue dan queue hanya karena orang yang berbeda menerapkannya.
sumber
priority_queue
harus tetap diurutkan, sehingga overhead yang lebih tinggi dari pengaksesan acakdeque::iterator
lebih bermasalah.priority_queue
memiliki "urutan ajaib" yang dipertahankan, tidak diurutkan. Namun, maksud Anda tetap berlaku.