by.Qin3Yu
ps.本文的哈希表特指unordered_map实现类型
文中所有代码默认已使用std命名空间且已导入部分头文件:
#include <iostream>
#include <unordered_map>
using namespace std;
优势:
1.高效性: 哈希表能够在平均情况下实现O(1)时间复杂度的插入和查找操作。
2.灵活性: 哈希表可以存储不同类型的数据。
3.调节性: 哈希表支持动态扩展,即使在插入大量元素时,也能够自动调整内部的存储空间大小。
缺点:
1.内存消耗: 哈希表在存储数据时需要额外的内存来存储散列桶、指针等信息。
2.冲突消耗: 由于散列函数可能将不同的键映射到相同的散列桶位置,一个不好的散列函数可能导致冲突过多,从而降低效率。
unordered_map<string, string> hs; //声明一个名为hs的哈希表,他的键和值都是字符串类型
//注意,“键值对”顾名思义,前者为键,后者为值
hs.insert({ "蝾螈", "newt" });
hs.insert({ "章鱼", "octopus"});
hs.insert({ "水豚", "capybara"});
hs.insert({ "牛蛙", "bullfrog" });
hs.insert({ "臭鼬", "skunk" });
cout << "请输入中文:";
string chinese; cin >> chinese; //输入中文为键
cout << "请输入英文:";
string english; cin >> english; //输入翻译为值
hs.insert({ chinese, english }); //插入 { 中文,翻译 } 键值对
hs.insert({ "狗", "dag" }); //单词dog拼写错误,需要删除键值对
hs.erase("狗"); //删除 { 狗 , dog } 键值对
hs.insert({ "臭鼬", "skunk" }); //我不喜欢臭鼬,所以删除 { 臭鼬 , skunk } 键值对
cout << hs["水豚"]; //哈希表中对应的键值对为 { 水豚 , kapybara }
//执行后控制台将会输出:kapybara
//此处我要通过值val找出对应的键
//代码将在后文详细解释
for (const auto& p : hs) {
if (p.second == val) {
cout << "对应的翻译是:" << p.first << endl;
}
}
if( hs.count(key) == 0 )
cout << "键值对不存在!";
else ( hs.count(key) == 1 )
cout << "键值对存在!";
题目:使用哈希表完成以下功能:创建一个简单的中英词典,用户可以根据中文查询英文( 进阶:也可以根据英文查询中文 ),并且用户可以向词典中添加和删除内容。
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
//这里我将大部分哈希表的相关操作单独写在getVal方法中,以便读者单独理解
//这里哈希表hs用引用类型,防止二次拷贝,从而节省内存
void getVal(unordered_map<string, string>& hs, string key) {
if (key[0] >= 65 && key[0] <= 122) {
//根据英文(值)查询中文(键)
//遍历哈希表
for (const auto& p : hs) {
if (p.second == key) {
cout << "对应的翻译是:" << p.first << endl;
return;
}
}
cout << "未查询到值!" << endl;
return;
}
if (hs.count(key) == 0) { //查询指定值的数量
cout << "未查询到值!" << endl;
return;
}
//根据中文(键)查询英文(值)
cout << "对应的翻译是:" << hs[key] << endl;
}
int main() {
//声明一个哈希表
unordered_map<string, string> hs;
//向哈希表中添加一些初始数据
hs.insert({ "蝾螈", "newt" });
hs.insert({ "章鱼", "octopus"});
hs.insert({ "水豚", "capybara"});
hs.insert({ "牛蛙", "bullfrog" });
hs.insert({ "臭鼬", "skunk" });
cout << "输入\"退出\"退出程序,输入\"删除\"删除单词,输入\"增加\"增加单词" << endl;
while (true) {
cout << "输入查询的单词:";
string s; cin >> s;
if (s == "删除") {
//此处仅举例根据键删除,若要根据值删除同理遍历哈希表即可
cout << "请输入要删除的单词的中文:";
cin >> s;
hs.erase(s);
cout << "已删除!" << endl;
}
else if (s == "退出")
break;
else if (s == "增加") {
//将用户输入的字符串作为参数传递给insert
cout << "请输入中文:";
string chinese; cin >> chinese;
cout << "请输入英文:";
string english; cin >> english;
hs.insert({ chinese, english });
cout << "已添加!" << endl;
}
else
getVal(hs, s);
}
return 0;
}
by.Qin3Yu