Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk menangani perlanggaran cincang apabila menggunakan C++ STL?
Konflik cincang C++ STL dikendalikan dengan cara berikut: Kaedah alamat rantai: Gunakan senarai terpaut untuk menyimpan elemen bercanggah, yang mempunyai kebolehgunaan yang baik. Kaedah pengalamatan terbuka: Cari lokasi yang tersedia dalam baldi untuk menyimpan elemen Sub-kaedah ialah: Pengesanan linear: Cari lokasi tersedia seterusnya dalam urutan. Pengesanan Kuadratik: Cari dengan melangkau kedudukan dalam bentuk kuadratik.
Apabila menggunakan jadual cincang Perpustakaan Templat Standard (STL) C++, perlanggaran tidak dapat dielakkan kerana berbilang kunci boleh dicincang pada baldi yang sama. Untuk mengendalikan konflik, STL menyediakan kaedah berikut:
Kaedah alamat rantaian menggunakan senarai terpaut untuk menyimpan elemen yang dicincang ke dalam baldi yang sama. Apabila konflik berlaku, nod senarai terpaut baharu dibuat dan elemen itu ditambahkan pada senarai terpaut. Ini ialah kaedah pengendalian perlanggaran yang paling biasa digunakan kerana ia mengendalikan jadual cincang padat dengan baik.
#include <unordered_map> #include <list> int main() { std::unordered_map<int, std::list<int>> hash_table; hash_table[10].push_back(100); hash_table[10].push_back(200); // 迭代哈希到 10 的键 for (auto& item : hash_table[10]) { std::cout << item << " "; // 输出 100 200 } return 0; }
Kaedah pengalamatan terbuka tidak akan mencipta nod baharu apabila konflik berlaku. Sebaliknya, ia mencari lokasi yang tersedia seterusnya dalam baldi untuk menyimpan elemen. Terdapat beberapa kaedah pengalamatan terbuka, yang paling biasa ialah probing linear dan probing kuadratik.
Penyelidikan linear:
#include <unordered_map> int main() { std::unordered_map<int, int> hash_table; hash_table[10] = 100; // 插入 (10, 100) hash_table[10] = 200; // 更新 (10, 200) // 访问更新后的值 std::cout << hash_table[10] << std::endl; // 输出 200 return 0; }
Penyelidikan kuadratik:
#include <unordered_map> int main() { std::unordered_map<int, int, std::hash<int>, std::equal_to<int>, QuadraticProbing<int, int>> hash_table; hash_table[10] = 100; // 插入 (10, 100) hash_table[10] = 200; // 更新 (10, 200) // 访问更新后的值 std::cout << hash_table[10] << std::endl; // 输出 200 return 0; }
Kaedah pengendalian perlanggaran yang dipilih bergantung pada jangkaan faktor beban jadual cincang. Kaedah pengalamatan rantaian secara amnya lebih sesuai untuk jadual cincang padat, manakala kaedah pengalamatan terbuka lebih sesuai untuk jadual cincang yang jarang.
Atas ialah kandungan terperinci Bagaimana untuk menangani perlanggaran cincang apabila menggunakan C++ STL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!