日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[C++STL]C++实现unordermap容器和unorderset容器

發布時間:2023/12/4 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C++STL]C++实现unordermap容器和unorderset容器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼如下:

#include <iostream> #include <vector> using namespace std;template<typename K,typename V,typename KeyOfValue> class HashTable;//聲明template<typename V> struct HashNode {typedef HashNode<V> Node;V _val;Node * _next;HashNode(const V & val):_val(val),_next(nullptr){} };template<typename K,typename V,typename KeyOfValue> struct HashIterator {typedef HashNode<V> Node;typedef HashIterator<K, V, KeyOfValue> Self;typedef HashTable<K, V, KeyOfValue>HT;Node *_node;HT * _hPtr;HashIterator(Node *node,HT *hPtr):_node(node),_hPtr(hPtr){}V &operator*(){return _node->_val;}V *operator->(){return &_node->_val;}bool operator!=(const Self & it){return _node != it._node;}Self & operator++(){if (_node->_next){_node = _node->_next;}else{KeyOfValue kov;size_t idx = kov(_node->_val) % _hPtr->_ht.size();++idx;for (; idx < _hPtr->_ht.size(); idx++){if (_hPtr->_ht[idx]){_node = _hPtr->_ht[idx];break;}}if (idx == _hPtr->_ht.size()) _node = nullptr;}return *this;}};template<typename K,typename V,typename KeyOfValue> class HashTable { public:typedef HashIterator<K, V, KeyOfValue> iterator;typedef HashNode<V> Node;template<typename K,typename V,typename KeyOfValue>friend struct HashIterator;HashTable(int n = 10):_ht(n),_size(0){}iterator begin(){for (size_t i = 0; i < _ht.size(); i++){if (_ht[i]){return iterator(_ht[i], this);}}return iterator(nullptr, this);}iterator end(){return iterator(nullptr, this);}pair<iterator, bool> insert(const V & val){//0.檢查容量checkCapacity();KeyOfValue kov;//1.計算hash位置int idx = kov(val) % _ht.size();//2.查找Node *cur = _ht[idx];while (cur){if (kov(cur->_val) == kov(val)) return make_pair(iterator(cur, this), false);cur = cur->_next;}//3.插入--頭插cur = new Node(val);cur->_next = _ht[idx];_ht[idx] = cur;++_size;return make_pair(iterator(cur, this), true);}void checkCapacity(){if (_size == _ht.size()){int newC = _size == 0 ? 10 : 2 * _size;vector<Node *>newHt(newC);KeyOfValue kov;for (size_t i = 0; i < _ht.size(); i++){Node *cur = _ht[i];while (cur){Node *next = cur->_next;int idx = kov(cur->_val) % newHt.size();cur->_next = newHt[idx];newHt[idx] = cur;cur = next;}_ht[i] = nullptr;}swap(_ht, newHt);}}private:vector<Node *> _ht;int _size; };template<typename K> class UnorderedSet {struct SetKeyOfValue{const K & operator()(const K & key){return key;}};public:typedef typename HashTable<K, K, SetKeyOfValue>::iterator iterator;pair<iterator, bool> insert(const K& key){return _ht.insert(key);}iterator begin(){return _ht.begin();}iterator end(){return _ht.end();}private:HashTable<K, K, SetKeyOfValue> _ht; };template<typename K,typename V> class UnorderedMap {struct MapKeyOfValue{const K& operator()(const pair<K, V> & val){return val.first;}};public:typedef typename HashTable<K, pair<K, V>, MapKeyOfValue>::iterator iterator;pair<iterator, bool > insert(const pair<K, V> & val){return _ht.insert(val);}iterator begin() {return _ht.begin();}iterator end(){return _ht.end();}V & operator[](const K& key){pair<iterator, bool> ret = _ht.insert(make_pair(key, V()));return ret.first->second;}private:HashTable<K, pair<K, V>, MapKeyOfValue> _ht; };int main() {UnorderedSet<int>s;s.insert(1);s.insert(123);s.insert(123412);s.insert(12);s.insert(1132);s.insert(1131);s.insert(436);s.insert(786);s.insert(13);s.insert(7965);s.insert(7653);s.insert(645);s.insert(324);UnorderedSet<int>::iterator it1 = s.begin();while (it1 != s.end()){cout << *it1 << " ";++it1;}cout << endl;for (const auto & e : s){cout << e << " ";}cout << endl;UnorderedMap<int, int>m;m.insert(make_pair(1, 1));m[2] = 2;m[3] = 3;UnorderedMap<int, int>::iterator it2 = m.begin();while (it2 != m.end()){cout << it2->first << "--->" << it2->second << endl;++it2;}cout << "--------------------" << endl;m[2] = 20;for (auto & p : m){cout << p.first << "--->" << p.second << endl;}return 0; }

測試結果:

總結

以上是生活随笔為你收集整理的[C++STL]C++实现unordermap容器和unorderset容器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。