Jawaban sebelumnya hanya membahas alternatif pohon dan merah hitam mungkin hanya tersisa karena alasan historis.
Mengapa bukan tabel hash?
Suatu tipe hanya membutuhkan <
operator (perbandingan) untuk digunakan sebagai kunci dalam pohon. Namun, tabel hash mengharuskan setiap jenis kunci memiliki hash
fungsi yang ditentukan. Menjaga persyaratan tipe menjadi minimum sangat penting untuk pemrograman generik sehingga Anda dapat menggunakannya dengan berbagai jenis dan algoritme.
Merancang tabel hash yang baik membutuhkan pengetahuan yang mendalam tentang konteks yang akan digunakan. Haruskah itu menggunakan pengalamatan terbuka, atau menghubungkan rantai? Tingkat beban apa yang harus diterima sebelum mengubah ukuran? Haruskah menggunakan hash mahal yang menghindari tabrakan, atau yang kasar dan cepat?
Karena STL tidak dapat mengantisipasi yang merupakan pilihan terbaik untuk aplikasi Anda, standarnya harus lebih fleksibel. Pohon "hanya bekerja" dan skala baik.
(C ++ 11 memang menambahkan tabel hash dengan unordered_map
. Anda dapat melihat dari dokumentasi itu memerlukan kebijakan pengaturan untuk mengkonfigurasi banyak opsi ini.)
Bagaimana dengan pohon lain?
Pohon Merah Hitam menawarkan pencarian cepat dan menyeimbangkan diri, tidak seperti BST. Pengguna lain menunjukkan kelebihannya dibandingkan dengan pohon AVL penyeimbang sendiri.
Alexander Stepanov (Pencipta STL) mengatakan bahwa ia akan menggunakan Pohon B * alih-alih pohon Merah-Hitam jika ia menulis std::map
lagi, karena lebih ramah untuk cache memori modern.
Salah satu perubahan terbesar sejak itu adalah pertumbuhan cache. Kehilangan cache sangat mahal, jadi lokasi referensi jauh lebih penting sekarang. Struktur data berbasis node, yang memiliki lokalitas referensi rendah, jauh lebih tidak masuk akal. Jika saya merancang STL hari ini, saya akan memiliki satu set wadah yang berbeda. Misalnya, pohon B * -tingkat dalam memori adalah pilihan yang jauh lebih baik daripada pohon merah-hitam untuk menerapkan wadah asosiatif. - Alexander Stepanov
Haruskah peta selalu menggunakan pohon?
Kemungkinan implementasi peta lainnya adalah vektor yang diurutkan (sortasi sort) dan pencarian biner. Ini akan bekerja dengan baik untuk kontainer yang tidak sering dimodifikasi tetapi sering ditanyai. Saya sering melakukan ini di C sebagai qsort
dan bsearch
dibangun.
Apakah saya perlu menggunakan peta?
Pertimbangan cache berarti jarang digunakan std::list
atau std::deque
berlebihanstd:vector
bahkan untuk situasi yang kami diajarkan di sekolah (seperti menghapus elemen dari bagian tengah daftar). Menerapkan alasan yang sama, menggunakan loop untuk pencarian linear daftar seringkali lebih efisien dan lebih bersih daripada membangun peta untuk beberapa pencarian.
Tentu saja memilih wadah yang mudah dibaca biasanya lebih penting daripada kinerja.