unordered_set/map(哈希表)干货归纳+用法详解

一.哈希表容器(unordered_set/map)

1.哈希表简介:

C++哈希表(hash table)是一种数据结构,用于存储和查找键值对。它是由一个哈希函数和一个数组组成的。哈希函数将键映射到数组中的一个位置,这个位置就是键值对应的索引。哈希表的主要特点包括:

  1. 快速查找:由于哈希函数的快速计算和定位,哈希表可以在常数时间内查找键。
  2. 空间效率:哈希表可以根据实际需要动态分配数组大小,所以空间使用效率很高。
  3. 灵活性:哈希表可以根据需求支持不同类型的键和值。

2.unordered_map和map区别:

  1. 快速的查找和插入操作:unordered_map 内部使用哈希表实现,因此查找和插入操作的时间复杂度为平均 O(1),最坏情况下为
    O(n)。
  2. 无序存储:与 map 不同,unordered_map
    内部并不按照键的大小顺序存储元素,而是根据哈希值将元素散列到不同的桶中,因此元素的存储顺序是无序的。
  3. 可以使用自定义类型作为键:unordered_map 可以使用自定义类型作为键,只需要定义自定义类型的哈希函数和相等比较函数即可。
  4. 消耗更多的空间:由于 unordered_map 内部需要维护哈希表,因此在存储相同数量的元素时,它通常会消耗更多的空间。

综上所述,unordered_map 适用于需要快速查找和插入元素,且不要求元素存储顺序的场景,尤其适合使用自定义类型作为键的情况。但是需要注意的是,由于哈希表的原因,unordered_map 并不支持 lower_bound 和 upper_bound 等操作,因此在需要按照键的大小顺序查找元素时,可以考虑使用 map。

3.unordered_map和unordered_set区别:

  1. 存储元素的方式:unordered_map 存储键值对,而 unordered_set 只存储键,没有值。
  2. 元素的唯一性:unordered_map 中每个键只能对应一个值,而 unordered_set 中每个键只能出现一次。
  3. 元素的访问:unordered_map 可以通过键来访问值,而 unordered_set 只能通过键来判断元素是否存在。
  4. 内部实现:unordered_map 和 unordered_set 都是使用哈希表实现的,但是 unordered_map
    需要同时保存键和值,因此在内部实现上需要比 unordered_set 多一些开销。

综上所述,unordered_map 和 unordered_set 的主要区别在于存储的元素类型和元素的唯一性。如果需要存储键值对且每个键只能对应一个值,则应该使用 unordered_map;如果只需要存储键且每个键只能出现一次,则应该使用 unordered_set。同时,由于它们都是使用哈希表实现的,因此在访问速度上也具有相似的优势。

二.unordered_set 用法示例:

在C++标准库中,unordered_set是一个使用哈希表实现的集合(set)容器,用于存储唯一的元素,且元素的存储没有特定的顺序。unordered_set使用哈希函数来将元素映射到桶中,不同的元素可能映射到同一个桶中,但是这些元素的哈希值不同。

1.insert()函数:用于插入元素,语法为:

std::unordered_set<int> myset;
myset.insert(3);
myset.insert(1);
myset.insert(7);

2.find()函数:用于查找元素,语法为:

std::unordered_set<int> myset = {1, 2, 3};
auto it = myset.find(2);
if (it != myset.end())
    std::cout << "Element found in unordered_set: " << *it << std::endl;
else
    std::cout << "Element not found in unordered_set" << std::endl;

3.erase()函数:用于删除元素,语法为:

std::unordered_set<int> myset = {1, 2, 3};
myset.erase(2);

4.size()函数:返回unordered_set中元素的数量,语法为:

std::unordered_set<int> myset = {1, 2, 3};
std::cout << "unordered_set size: " << myset.size() << std::endl;

5.empty()函数:检查unordered_set是否为空,语法为:

std::unordered_set<int> myset;
if (myset.empty())
    std::cout << "unordered_set is empty" << std::endl;
else
    std::cout << "unordered_set is not empty" << std::endl;

6.clear()函数:用于清空unordered_set中的所有元素,语法为:

std::unordered_set<int> myset = {1, 2, 3};
myset.clear();

这些函数是unordered_set中最常用的一些函数。除此之外,还有一些其他的函数,如bucket(),load_factor()和max_load_factor()等,它们用于查询哈希表的桶的数量、负载因子和最大负载因子等信息。

三.unordered_map 用法示例:

1.unordered_map::insert(): 向 unordered_map 中插入元素,接受一个 pair 类型的参数或两个迭代器。

unordered_map<int, string> map;
map.insert(make_pair(1, "one"));
map.insert({2, "two"});
map.insert(map.end(), {3, "three"});

2.unordered_map::find(): 查找指定键值的元素,返回一个指向该元素的迭代器,如果未找到则返回 unordered_map::end()。

unordered_map<int, string> map = {{1, "one"}, {2, "two"}, {3, "three"}};
auto it = map.find(2);
if (it != map.end()) {
    cout << "Found " << it->second << endl;
}

3.unordered_map::erase(): 从 unordered_map 中删除指定键值的元素,接受一个键值作为参数。

unordered_map<int, string> map = {{1, "one"}, {2, "two"}, {3, "three"}};
map.erase(2);

4.unordered_map::size(): 返回 unordered_map 中元素的数量。

unordered_map<int, string> map = {{1, "one"}, {2, "two"}, {3, "three"}};
cout << "Size of map: " << map.size() << endl;

5.unordered_map::empty(): 返回 unordered_map 是否为空。

unordered_map<int, string> map;
if (map.empty()) {
    cout << "Map is empty" << endl;
}

6.unordered_map::clear(): 删除 unordered_map 中的所有元素。

unordered_map<int, string> map = {{1, "one"}, {2, "two"}, {3, "three"}};
map.clear();

除此之外,unordered_map 还支持其他的一些函数和操作,如 unordered_map::count()、unordered_map::operator[] 等。具体用法可以查阅 C++ STL 文档。

  • 12
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiuZuqiang_3027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值