C++之STL哈希表

set/ multiset 容器:所有元素都会在插入时自动被排序
(1)本质:set/multiset属于关联式容器,底层结构是用二叉树实现。
(2)set和multiset区别:set不允许容器中有重复的元素;multiset允许容器中有重复的元素

1)构造:set<T> st;//set<int> s1;
	拷贝构造set(sonst set& st) //set<int>s2(s1)2insert():插入
(3clear():清空所有元素
(4erase(pos):删除pos迭代器所指的元素,并返回下一个元素的迭代器
(5erase(begin,end):删除区间[begin,end)的所有元素,并返回下一个元素的迭代器
(6erase(elem):删除容器中值为elem的元素
(7size():大小
(8empty():判断是否为空
(9swap(st):交换两个容器
(10find(key):查找key是否存在,存在返回该元素的迭代器,不存在,返回set.end();11count(key):统计key的元素个数

map/ multimap容器
map中所有元素都是pair
(1)介绍:pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值);所有元素都会根据元素的键值自动排序
(2)本质:map/multimap属于关联式容器,底层结构是用二叉树实现。
(3)优点:可以根据key值快速找到value值
(4)map和multimap区别:map不允许容器中有重复key值元素;multimap允许容器中有重复key值元素

1)构造:map<T1,T2> st;
	拷贝构造set(sonst map& mp)2insert(elem):插入
(3clear():清空所有元素
(4erase(pos):删除pos迭代器所指的元素,并返回下一个元素的迭代器
(5erase(begin,end):删除区间[begin,end)的所有元素,并返回下一个元素的迭代器
(6erase(elem):删除容器中值为elem的元素
(7size():大小
(8empty():判断是否为空
(9swap(st):交换两个容器
(10find(key):查找key是否存在,存在返回该元素的迭代器,不存在,返回map.end();11count(key):统计key的元素个数

unordered_map

0)头文件:#include<unordered_map>1)初始化:unordered_map<int, int> hmap;2insert():插入;
(3begin()函数:该函数返回一个指向哈希表开始位置的迭代器
(4end()函数:作用于begin函数相同,返回一个指向哈希表结尾位置的下一个元素的迭代器
(5cbegin()cend():和begin()end()相同,区别是cbegin()cend()是面向不可变的哈希表
(6empty()函数:判断哈希表是否为空,空则返回true,非空返回false7size()函数:返回哈希表的大小
(8erase()函数:删除某个位置的元素,或者删除某个位置开始到某个位置结束这一范围内的元素,或者传入key值删除键值对
(9at()函数:根据key查找哈希表中的元素
(10clear()函数:清空哈希表中的元素
(11find()函数:以key作为参数寻找哈希表中的元素,如果哈希表中存在该key值则返回该位置上的迭代器,否则返回end()下一位置上的迭代器
(12count()函数: 统计某个key值对应的元素个数, 因为unordered_map不允许重复元素,所以返回值为01

参考:https://blog.csdn.net/Peealy/article/details/116895964

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++中实现哈希表,可以通过以下步骤进行: 1. 定义一个哈希函数,将键(key)映射到哈希表中的索引。哈希函数应该是高效的,尽可能地减少哈希冲突。 2. 定义一个数组,用于存储哈希表中的元素(键值对)。 3. 在数组中插入一个元素时,先使用哈希函数计算出该元素的索引,然后将元素插入到该索引处。如果该索引处已经有元素,则需要解决哈希冲突,例如使用开放寻址法或链表法。 4. 在数组中查找一个元素时,同样使用哈希函数计算出该元素的索引,然后在该索引处查找元素。如果该索引处没有元素,则说明该元素不在哈希表中。 以下是一个简单的示例代码,演示了如何实现一个基本的哈希表,其中使用了开放寻址法来解决哈希冲突: ```c++ #include <iostream> const int TABLE_SIZE = 128; class HashTable { private: struct Node { int key; int value; bool is_deleted; // 标记是否被删除 }; Node table[TABLE_SIZE]; // 哈希函数 int hash(int key) const { return key % TABLE_SIZE; } public: HashTable() { for (int i = 0; i < TABLE_SIZE; ++i) { table[i].key = -1; table[i].value = -1; table[i].is_deleted = false; } } // 插入元素 void insert(int key, int value) { int index = hash(key); while (table[index].key != -1 && table[index].is_deleted == false) { // 线性探测 index = (index + 1) % TABLE_SIZE; } table[index].key = key; table[index].value = value; table[index].is_deleted = false; } // 查找元素 int find(int key) const { int index = hash(key); while (table[index].key != -1) { if (table[index].key == key && table[index].is_deleted == false) { return table[index].value; } index = (index + 1) % TABLE_SIZE; } return -1; } // 删除元素 void remove(int key) { int index = hash(key); while (table[index].key != -1) { if (table[index].key == key && table[index].is_deleted == false) { table[index].is_deleted = true; return; } index = (index + 1) % TABLE_SIZE; } } }; int main() { HashTable ht; ht.insert(1, 10); ht.insert(2, 20); ht.insert(3, 30); std::cout << ht.find(2) << std::endl; // 输出 20 ht.remove(2); std::cout << ht.find(2) << std::endl; // 输出 -1 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值