unordered_map简介
-
哈希表实现:键通过哈希函数转换成索引,将元素分布在内部存储桶中,实现快速访问。 -
键值对无序:std::unordered_map 不维护元素的顺序,元素的排列顺序依赖于哈希函数和存储解决冲突的方法。 -
键唯一:每个键在unordered_map中是唯一的,不能有两个相同的键存在。 -
动态扩展:容器会根据元素数量自动调整大小,确保哈希表的效率。
-
insert(): 插入一个键值对,如果键已存在则不会插入。 -
emplace(): 直接在容器中构造键值对,避免额外的复制或移动操作。 -
[ ]: 访问给定键对应的值,如果键不存在则会插入该键并初始化其值。 -
at(): 访问给定键对应的值,如果键不存在则抛出std::out_of_range异常。 -
size(): 返回容器中键值对的数量。 -
empty(): 检查容器是否为空,即是否包含0个键值对。 -
clear(): 移除所有键值对,清空容器。 -
erase(): 移除一个给定键的键值对。 -
find(): 查找一个键,如果找到,则返回一个迭代器指向键值对;如果未找到,则返回指向容器末尾的迭代器。 -
count(): 返回给定键在容器中的数量(由于unordered_map键的唯一性,结果为0或1)。
实例讲解
-
首先需要导入对应的头文件
-
然后可以向unorfer_map中插入元素并遍历:
// 创建一个unorder_map
std::unordered_map<std::string, int> umap;
// 插入元素
umap.insert({"apple", 2});
umap.emplace("banana", 4);
// 遍历unordered_map
for (const auto& pair : umap) {
std::cout << pair.first << " has count " << pair.second << std::endl;
}
-
下面给出完整的示例代码:
int main() {
// 创建一个unordered_map,键是字符串,值是int
std::unordered_map<std::string, int> umap;
// 插入元素
umap.insert({"apple", 2});
umap.emplace("banana", 4);
// 通过索引操作符[]插入或修改元素
umap["orange"] = 5;
// 如果键不存在,将创建新元素
umap["apple"] = 10; // 更新已有键的值
// 访问元素
std::cout << "apple: " << umap["apple"] << std::endl; // 输出: apple: 10
// 使用at()访问元素,如果键不存在会抛出异常
try {
std::cout << "banana: " << umap.at("banana") << std::endl; // 输出: banana: 4
} catch (const std::out_of_range& e) {
std::cerr << "Key not found: " << e.what() << std::endl;
}
// 检查某个键是否存储在容器中
if(umap.find("kiwi") != umap.end()) {
std::cout << "kiwi exists in the map." << std::endl;
} else {
std::cout << "kiwi does not exist in the map." << std::endl;
}
// 遍历unordered_map
for (const auto& pair : umap) {
std::cout << pair.first << " has count " << pair.second << std::endl;
}
// 检查容器是否为空
if (!umap.empty()) {
std::cout << "The map is not empty." << std::endl;
}
// 查看容器中的元素数
std::cout << "The map has " << umap.size() << " elements." << std::endl;
// 删除元素
umap.erase("banana");
// 清空容器
umap.clear();
return 0;
}
原文始发于微信公众号(赛博安全狗):【开发内功】STL unordered_map学习
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论