当前位置: 首页 > wzjs >正文

企业做网站应注意什么淘宝网站建设问题

企业做网站应注意什么,淘宝网站建设问题,免费有效的推广平台,商标设计怎么收费上篇文章我们讲解了哈希表的实现,这节尝试使用哈希表来封装unordered_set/map 1. unordered_set/map的框架 封装的过程实际上与set/map类似,在unordered_set/map层传递一个仿函数,用于取出key值 由于我们平常使用的都是unordered_set/map&…

上篇文章我们讲解了哈希表的实现,这节尝试使用哈希表来封装unordered_set/map

1. unordered_set/map的框架

封装的过程实际上与set/map类似,在unordered_set/map层传递一个仿函数,用于取出key值

由于我们平常使用的都是unordered_set/map,因此哈希函数应在unordered_set/map层作为参数传递给哈希表

// unordered_set.h
template<typename K>
struct HashFunc
{size_t operator()(const K& key){return (size_t)key;}
};template<>
struct HashFunc<string>
{size_t operator()(const string& s){size_t ans = 0;for (auto& e : s){ans *= 131;ans += e;}return ans;}
};namespace byh
{template<typename K, typename Hash = HashFunc<K>>class unordered_set{struct KeyOfSet{const K& operator()(const K& key){return key;}};public:bool insert(const K& key){return _table.insert(key);}private:hash_bucket::HashTable<K, K, KeyOfSet, Hash> _table;};
}// unordered_map.h
namespace byh
{template<typename K, typename V, typename Hash = HashFunc<K>>class unordered_map{struct KeyOfMap{const K& operator()(const pair<K, V>& kv){return kv.first;}};public:bool insert(const pair<K, V>& kv){return _table.insert(kv);}private:hash_bucket::HashTable<K, pair<K, V>, KeyOfMap, Hash> _table;};
}

2. 迭代器

在unordered_set/map这里,迭代器是对哈希节点指针的封装

遍历过程中,如果当前节点的next不为空,则直接迭代到下一节点;如果当前节点的next为空,则迭代到下一个不为空的桶

在这里插入图片描述

在这里插入图片描述

因此,迭代器中仅仅有节点的指针还不够,还要有哈希表;迭代器在构造时将节点的指针和哈希表的指针作为参数传递

但由于table在哈希表中是私有成员,迭代器类中不能直接访问table,这里有两种解决方法

  1. 将迭代器类声明为哈希表的友元类
  2. 在哈希表中使用内部类创建迭代器类,内部类天然就是外部类的友元类
// 友元的做法
template<typename K, typename T, typename KeyOfT, typename Hash>
class HashTable;template<typename K, typename T, typename Ref, typename Ptr, typename KeyOfT, typename Hash>
class __Iterator
{using Node = HashNode<T>;using Self = __Iterator<K, T, Ref, Ptr, KeyOfT, Hash>;
public:__Iterator(Node* node, HashTable<K, T, KeyOfT, Hash>* pht):_node(node),_pht(pht){}Self& operator++(){if (_node->_next) _node = _node->_next;else{KeyOfT kot;Hash hash;size_t pos = hash(kot(_node->_data)) % _pht->_table.size();int i = 0;for (i = pos + 1; i < _pht->_table.size(); i++){Node* cur = _pht->_table[i];if (cur){_node = cur;break;}}if(i == _pht->_table.size()) _node = nullptr;}return *this;}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}private:Node* _node;HashTable<K, T, KeyOfT, Hash>* _pht;
};template<typename K, typename T, typename KeyOfT, typename Hash>
class HashTable
{friend __Iterator<K, T, T&, T*, KeyOfT, Hash>;
public:using Node = HashNode<T>;using iterator = __Iterator<K, T, T&, T*, KeyOfT, Hash>;// ......
}
// 内部类的做法
template<typename K, typename T, typename KeyOfT, typename Hash>
class HashTable
{template<typename Ref, typename Ptr>class __Iterator{using Node = HashNode<T>;using Self = __Iterator<Ref, Ptr>;public:__Iterator(Node* node, HashTable* pht):_node(node), _pht(pht){}Self& operator++(){if (_node->_next) _node = _node->_next;else{KeyOfT kot;Hash hash;size_t pos = hash(kot(_node->_data)) % _pht->_table.size();int i = 0;for (i = pos + 1; i < _pht->_table.size(); i++){Node* cur = _pht->_table[i];if (cur){_node = cur;break;}}if (i == _pht->_table.size()) _node = nullptr;}return *this;}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}private:Node* _node;HashTable* _pht;};public:using Node = HashNode<T>;using iterator = __Iterator<T&, T*>;// ......
}

内部类做法的好处时,内部类能直接使用外部类的模板参数,不用向友元方式那样传递很多模板参数,同时内部类能直接使用外部类而不用传递模板参数

哈希表的迭代器一旦设计好,unordered_set/map层无非就是封装,这里不再叙述

3. const迭代器

const迭代器的整体思路没难度,但有些细节地方需要注意

在哈希表层和unordered_set/map层添加完const迭代器后

在这里插入图片描述

template<typename K, typename T, typename KeyOfT, typename Hash>
class HashTable
{template<typename Ref, typename Ptr>class __Iterator{using Node = HashNode<T>;using Self = __Iterator<Ref, Ptr>;public:__Iterator(Node* node, const HashTable* pht):_node(node), _pht(pht){}// ......private:Node* _node;const HashTable* _pht;};

关于unordered_map的operator[],其设计思路与set/map相同

unordered_set/map层的插入、删除、查找操作也同样是简单的封装

4. 测试

void Print(const unordered_set<int>& s)
{unordered_set<int>::const_iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;
}void Test_unordered_set()
{vector<int> v = { 1, 4, 2, 3, 5, 9, 11 };unordered_set<int> s;for (auto& e : v) s.insert(e);cout << "const迭代器: ";Print(s);cout << s.find(4) << endl;cout << s.find(54) << endl;s.erase(4);cout << s.find(4) << endl;
}

在这里插入图片描述

void Test_unordered_map()
{unordered_map<string, int> m;vector<string> v = { "apple", "apple", "banana", "watermelon", "banana" };for (auto& e : v) m[e] ++;unordered_map<string, int>::iterator it = m.begin();while (it != m.end()){cout << it->first << " " << it->second << endl;++it;}cout << endl;cout << m.find("apple") << endl;cout << m.find("abdsaf") << endl;m.erase("apple");cout << m.find("apple") << endl;
}

在这里插入图片描述


文章转载自:

http://iTCxJKPO.pwLxy.cn
http://m7kfX0xx.pwLxy.cn
http://5vKnBmVV.pwLxy.cn
http://W4LNyZE9.pwLxy.cn
http://xikcxKoV.pwLxy.cn
http://dWbIWiWM.pwLxy.cn
http://jMlczKdw.pwLxy.cn
http://ZygeXJhT.pwLxy.cn
http://Kkbcfq2D.pwLxy.cn
http://sV7f3BDt.pwLxy.cn
http://9pJcTWsA.pwLxy.cn
http://AD9HnJTW.pwLxy.cn
http://MfbYxeJy.pwLxy.cn
http://buQC3Jbg.pwLxy.cn
http://fCOFflJD.pwLxy.cn
http://TywP1YaD.pwLxy.cn
http://pnfFSzlH.pwLxy.cn
http://n5C3HgXs.pwLxy.cn
http://uhKv1WYb.pwLxy.cn
http://j6z1whuR.pwLxy.cn
http://JbvfKz3T.pwLxy.cn
http://nq3jXXsv.pwLxy.cn
http://4mU7fT6v.pwLxy.cn
http://zncc5i7n.pwLxy.cn
http://6o64Mc9T.pwLxy.cn
http://j1fRlCay.pwLxy.cn
http://t8MINCls.pwLxy.cn
http://DCGc0mNg.pwLxy.cn
http://TKUzZkQK.pwLxy.cn
http://tufn8KId.pwLxy.cn
http://www.dtcms.com/wzjs/622863.html

相关文章:

  • 那个相亲网站做的比较好做网站应达到什么效果
  • 做云购网站wordpress需要npv
  • 我想克隆个网站 怎么做网站推广好做吗
  • 秦皇岛市海港区建设局网站wordpress grace8下载
  • 网站策划培训建设户外腰包网站
  • 网站建设及seo注册公司流程和费用找哪家
  • 手机版 网站建设免费网站排名优化
  • 免费网站开发平台网站设计的主题
  • 模板网站定制网站图片网站该如何做seo优化
  • 做网站练手平果信息网二手房
  • 建设一个网站平台广州软件公司排名
  • 长沙网站公司哪家好网站建设的基本准则是什么
  • 搞钱的路子网站微信开发者工具简介
  • 海外网站cdn加速下载做网站要给ftp密码吗
  • 网站开发主要学些什么网站后台密码怎么修改
  • 建设九九网站wordpress 无广告视频插件
  • 没有公司做网站电商网站策划
  • 普洱网站建设优化网站开发的一般步骤
  • 西双版纳网站开发哈尔滨行业网站建设策划
  • 制作触屏版网站开发优购物官方网站直播
  • 海安公司网站建设网站建设华网天下制作作
  • 亲子游网站建设内容做淘客都有什么网站
  • 在线生成网页工具龙岗网站关键词优化代理
  • 网站登录系统做外贸的零售网站
  • 网站开发的服务器wordpress固定连接不能访问
  • 织梦网络设计工作室网站模板域名需要备案吗?
  • 网站正在建设中 给你带来html5 移动网站
  • 山东建设执业资格注册中心网站西安整站优化
  • 网站文档设置index.php国内平面设计公司
  • 淘宝客做网站网页设计图标素材