哈希表的定义和查找方法就不再赘述,此随笔主要写代码中的用法加深自己印象。
声明哈希表:
#include<unordered_map>
unordered_map<eleType_1, eleType_2> var_name;
unordered_map<int, int> map;
//或者之前用过的char int类型,char为key,int为char的值。后面的变量为两个
unordered_map<char, int> ans, arr;
初始化哈希表
//这是int型的
unordered_map<int,int> hmap{ {1,10},{2,15},{3,20},{4,0},{5,12}};
//这是以char为关键字
unordered_map<char, int> ans{ {a,1},{b,1},{c,1},{f,2}};
通过直接赋值来进行元素添加(类似数组)
//这里是把hamp的key对应的数值进行改变,例如
//把上面的{4,0}中的值改成了14,{5,12}中的值改成15
hmap[4] = 14;
hmap[5] = 15;
同时还有内置函数insert来实现元素插入
hamp.insert({5,15});
复制另一个不为空的哈希表,把hmap复制给tests
unordered_map<int,int>hmap{ {1,10},{2,8},{3,7}};
unordered_map<int,int> tests(hmap);
STL中的常用函数
//申请迭代器,把迭代器的位置赋值到哈希表起始位置
unordered_map<int,int>::iterator iter = hmap.begin();
cout << iter->first << ":" <<iter->second;
//下面等同于上面
unordered_map<char,int> ans;
unordered_map<char,int>::iterator iter = ans.begin()
unordered_map<char,int>::iterator tailer = ans.begin()
1)begin函数,类似于return head,返回开始位置的迭代器,iterator是迭代器的类型
2)end函数,就是在哈希表的结尾位置的下一个元素的迭代器
如下copy-paste 解释
在 C++ 标准库的 unordered_map 中,.end() 返回的是一个指向容器末尾位置之后一个位置的迭代器。也就是说,tailer 指向的位置并不是容器中最后一个元素,而是超出容器实际元素范围的一个位置。这个位置通常被称为“哨兵”或“尾后迭代器”。
这意味着 tailer 不能用于访问任何有效的元素,如果试图解引用它(例如 *tailer),会导致未定义行为。因此,通常在迭代遍历容器时,用 iter != ans.end() 作为循环结束的条件,而不会试图访问 end() 所指向的位置。
int main() {
std::unordered_map<char, int> ans;
ans['a'] = 1;
ans['b'] = 2;
ans['c'] = 3;
// 申请迭代器并初始化为哈希表的末尾位置
std::unordered_map<char, int>::iterator tailer = ans.end();
// 遍历哈希表
for (std::unordered_map<char, int>::iterator iter = ans.begin(); iter != ans.end(); ++iter) {
std::cout << iter->first << ": " << iter->second << std::endl;
}
return 0;
3)cbegin和cend 这两个函数与begin|end的用法相同,只不过是"const"->即无法改变的“常”哈希表
const unordered_map<int,int> hmap{{1,10},{2,12},{3,12}};
unordered_map<int,int>::const_iterator iter_b = hmap.cbegin();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~iter_a = hmap.cend();
标签:map,常用,迭代,hmap,hashtable,哈希,ans,方法,unordered
From: https://www.cnblogs.com/ink-bai/p/18223468