int>test_map;89test_map[0] =1;10intkey =0;11unordered_map<int,int>::iterator tmp =test_map.find(key);12if(tmp ==test_map.end()) {13cout <<"no key"<< key <<endl;14}15else{16cout <<"exist key"<< key <<endl;17cout <<"first:"<< tmp->first <<"second:"<...
如下图,我们删除30,会导致查找20失败,当我们给每个位置加⼀个状态标识{EXIST,EMPTY,DELETE} ,删除30就可以不⽤删除值,⽽是把状态改为 DELETE ,那么查找20时是遇到 EMPTY 才能,就可以找到20。 h(19) = 8,h(30) = 8,h(5) = 5,h(36) = 3,h(13) = 2,h(20) = 9,h(21) =10,h(12) ...
<< std::endl; } return 0; } 运行上述代码,如果keyToFind的值存在于unordered_map中,将输出“Key 2 exists in unordered_map.”,否则将输出“Key 2 does not exist in unordered_map.”。
注意往后探测过程中不能超过数组长度,所以我们每向后走一次就需要%数组长度,以保证当超过数组长度时,下标能回到数组开头。 如何判断这个位置是否为空,只需将每个位置里面存入一个状态值(枚举类型),总共有三个状态:EMPTY,EXIST,DELETE,分别表示空,存在数据,之前有数据但被删除 这部分代码只需理解线性探测思路就行,其...
(e._state == EXIST){newHT.Insert(e._kv);//取原表中的数据插入到新表的vector里面,键值对之间发生赋值重载。因为newHT是新开的初始化好的哈希表//递归通常是自己调用自己,这里不是递归,仅仅是代码复用而已。}}_tables.swap(newHT._tables);}size_t hashi = Hash()(kv.first) % _tables.size();/...
因此线性探测采用标记的伪删除法来删除一个元素,并没有将该元素真正的删除掉,而是采用标记的方式处理,但是不能直接将该位置标记为空,否则会影响从该位置产生冲突的元素的查找。。哈希表每个空间给个标记:EMPTY 表示此位置空,EXIST 表示此位置已经有元素,DELETE 表示元素已经删除。
但有一种极端特殊情况,就是边插入边删除,这样整个哈希表中的结点状态有可能都是delete或exist,则在线性探测中不会遇到empty,while会陷入死循环,所以在while里面多加一层判断,如果start等于hashi,说明在哈希表中已经线性探测一圈了,那此时就返回,因为找了一圈都没找到key,那就说明key不在哈希表里面。
{ std::cout <<"In name, first key is --> "<< val.first <<"\tsecond value is --> "<< val.second << std::endl; } std::cout << std::endl;// use find functionstd::unordered_map<int, std::string>::iterator itr; std::cout <<"use find to judge key 2 whether exist\n"...
C++中unordered_map几种按键查询比较 C++中unordered_map⼏种按键查询⽐较unorder_map有3种常见按键查值⽅法。使⽤头⽂件<unordered_map>和<iostream>,以及命名空间std。第⼀种是按键访问。如果键存在,则返回键对应的值;如果键不存在,则返回0;1 #include<unordered_map> 2 #include<iostream> 3 4...
std::cout <<"\nkey value 3 exist in this map, and its value is --> "<< name.at(3) << std::endl; }// use erase function to delete elementif(name.count(2)) { name.erase(2); std::cout <<"\nsize of name is --> "<< name.size() << std::endl; ...