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

第三方网站流量统计北京市

第三方网站流量统计,北京市,福州外贸网站制作,长沙知名网站推广用过map吧#xff1f;map提供一个很常用的功能#xff0c;那就是提供key-value的存储和查找功能。例如#xff0c;我要记录一个人名和相应的存储#xff0c;而且随时增加#xff0c;要快速查找和修改#xff1a; 岳不群#xff0d;华山派掌门人#xff0c;人称君子剑 …  用过map吧map提供一个很常用的功能那就是提供key-value的存储和查找功能。例如我要记录一个人名和相应的存储而且随时增加要快速查找和修改 岳不群华山派掌门人人称君子剑 张三丰武当掌门人太极拳创始人 东方不败第一高手葵花宝典 ... 这些信息如果保存下来并不复杂但是找起来比较麻烦。例如我要找张三丰的信息最傻的方法就是取得所有的记录然后按照名字一个一个比较。如果要速度快就需要把这些记录按照字母顺序排列然后按照二分法查找。但是增加记录的时候同时需要保持记录有序因此需要插入排序。考虑到效率这就需要用到二叉树。讲下去会没完没了如果你使用STL 的map容器你可以非常方便的实现这个功能而不用关心其细节。关于map的数据结构细节感兴趣的朋友可以参看学习STL map, STL set之数据结构基础。看看map的实现: #include map #include string using namespace std; ... mapstring, string namemap; //增加。。。 namemap[岳不群]华山派掌门人人称君子剑; namemap[张三丰]武当掌门人太极拳创始人; namemap[东方不败]第一高手葵花宝典; ... //查找。。 if(namemap.find(岳不群) ! namemap.end()){ ... } 不觉得用起来很easy吗而且效率很高100万条记录最多也只要20次的string.compare的比较就能找到你要找的记录;200万条记录事也只要用21次的比较。 速度永远都满足不了现实的需求。如果有100万条记录我需要频繁进行搜索时20次比较也会成为瓶颈要是能降到一次或者两次比较是否有可能而且当记录数到200万的时候也是一次或者两次的比较是否有可能而且还需要和map一样的方便使用。 答案是肯定的。这时你需要has_map. 虽然hash_map目前并没有纳入C 标准模板库中但几乎每个版本的STL都提供了相应的实现。而且应用十分广泛。在正式使用hash_map之前先看看hash_map的原理。 1 数据结构hash_map原理 这是一节让你深入理解hash_map的介绍如果你只是想囫囵吞枣不想理解其原理你倒是可以略过这一节但我还是建议你看看多了解一些没有坏处。 hash_map基于hash table哈希表。 哈希表最大的优点就是把数据的存储和查找消耗的时间大大降低几乎可以看成是常数时间而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下用空间换时间的做法是值得的。另外编码比较容易也是它的特点之一。 其基本原理是使用一个下标范围比较大的数组来存储元素。可以设计一个函数哈希函数也叫做散列函数使得每个元素的关键字都与一个函数值即数组下标hash值相对应于是用这个数组单元来存储这个元素也可以简单的理解为按照关键字为每一个元素“分类”然后将这个元素存储在相应“类”所对应的地方称为桶。 但是不能够保证每个元素的关键字与函数值是一一对应的因此极有可能出现对于不同的元素却计算出了相同的函数值这样就产生了“冲突”换句话说就是把不同的元素分在了相同的“类”之中。 总的来说“直接定址”与“解决冲突”是哈希表的两大特点。 hash_map首先分配一大片内存形成许多桶。是利用hash函数对key进行映射到不同区域桶进行保存。其插入过程是 得到key 通过hash函数得到hash值 得到桶号(一般都为hash值对桶数求模) 存放key和value在桶内。 其取值过程是: 得到key 通过hash函数得到hash值 得到桶号(一般都为hash值对桶数求模) 比较桶的内部元素是否与key相等若都不相等则没有找到。 取出相等的记录的value。 hash_map中直接地址用hash函数生成解决冲突用比较函数解决。这里可以看出如果每个桶内部只有一个元素那么查找的时候只有一次比较。当许多桶内没有值时许多查询就会更快了(指查不到的时候). 由此可见要实现哈希表, 和用户相关的是hash函数和比较函数。这两个参数刚好是我们在使用hash_map时需要指定的参数。 2 hash_map 使用 2.1 一个简单实例 不要着急如何把岳不群用hash_map表示我们先看一个简单的例子随机给你一个ID号和ID号相应的信息ID号的范围是12的31次方。如何快速保存查找。 #include hash_map #include string using namespace std; int main(){ hash_mapint, string mymap; mymap[9527]唐伯虎点秋香; mymap[1000000]百万富翁的生活; mymap[10000]白领的工资底线; ... if(mymap.find(10000) ! mymap.end()){ ... } 够简单和map使用方法一样。这时你或许会问hash函数和比较函数呢不是要指定么你说对了但是在你没有指定hash函数和比较函数的时候你会有一个缺省的函数看看hash_map的声明你会更加明白。下面是SGI STL的声明 template class _Key, class _Tp, class _HashFcn hash_Key, class _EqualKey equal_to_Key, class _Alloc __STL_DEFAULT_ALLOCATOR(_Tp) class hash_map { ... } 也就是说在上例中有以下等同关系 ... hash_mapint, string mymap; //等同于: hash_mapint, string, hashint, equal_toint mymap; Alloc我们就不要取关注太多了(希望深入了解Allocator的朋友可以参看标准库 STL Allocator能做什么) 2.2 hash_map 的hash函数 hash int到底是什么样子看看源码: struct hashint { size_t operator()(int __x) const { return __x; } }; 原来是个函数对象。在SGI STL中提供了以下hash函数 struct hashchar* struct hashconst char* struct hashchar struct hashunsigned char struct hashsigned char struct hashshort struct hashunsigned short struct hashint struct hashunsigned int struct hashlong struct hashunsigned long 也就是说如果你的key使用的是以上类型中的一种你都可以使用缺省的hash函数。当然你自己也可以定义自己的hash函数。对于自定义变量你只能如此例如对于string就必须自定义hash函数。例如 struct str_hash{ size_t operator()(const string str) const { unsigned long __h 0; for (size_t i 0 ; i str.size() ; i ) __h 5*__h str[i]; return size_t(__h); } }; //如果你希望利用系统定义的字符串hash函数你可以这样写 struct str_hash{ size_t operator()(const string str) const { return return __stl_hash_string(str.c_str()); } }; 在声明自己的哈希函数时要注意以下几点 使用struct然后重载operator(). 返回是size_t 参数是你要hash的key的类型。 函数是const类型的。 如果这些比较难记最简单的方法就是照猫画虎找一个函数改改就是了。 现在可以对开头的岳不群进行哈希化了 . 直接替换成下面的声明即可 mapstring, string namemap; //改为 hash_mapstring, string, str_hash namemap; 其他用法都不用边。当然不要忘了吧str_hash的声明以及头文件改为hash_map。 你或许会问比较函数呢别着急这里就开始介绍hash_map中的比较函数。 2.3 hash_map 的比较函数 在map中的比较函数需要提供less函数。如果没有提供缺省的也是less Key 。在hash_map中要比较桶内的数据和key是否相等因此需要的是是否等于的函数:equal_to Key 。先看看equal_to的源码 //本代码可以从SGI STL //先看看binary_function 函数声明其实只是定义一些类型而已。 template class _Arg1, class _Arg2, class _Result struct binary_function { typedef _Arg1 first_argument_type; typedef _Arg2 second_argument_type; typedef _Result result_type; }; //看看equal_to的定义 template class _Tp struct equal_to : public binary_function_Tp,_Tp,bool { bool operator()(const _Tp __x, const _Tp __y) const { return __x __y; } }; 如果你使用一个自定义的数据类型如struct mystruct, 或者const char* 的字符串如何使用比较函数使用比较函数有两种方法. 第一种是重载操作符利用equal_to;看看下面的例子 struct mystruct{ int iID; int len; bool operator(const mystruct my) const{ return (iIDmy.iID) (lenmy.len) ; } }; 这样就可以使用equal_to mystruct作为比较函数了。另一种方法就是使用函数对象。自定义一个比较函数体 struct compare_str{ bool operator()(const char* p1, const char*p2) const{ return strcmp(p1,p2)0; } }; 有了compare_str就可以使用hash_map了。 typedef hash_mapconst char*, string, hashconst char*, compare_str StrIntMap; StrIntMap namemap; namemap[岳不群]华山派掌门人人称君子剑; namemap[张三丰]武当掌门人太极拳创始人; namemap[东方不败]第一高手葵花宝典; 2.4 hash_map 函数 hash_map的函数和map的函数差不多。具体函数的参数和解释请参看STL 编程手册Hash_map这里主要介绍几个常用函数。 hash_map(size_type n) 如果讲究效率这个参数是必须要设置的。n 主要用来设置hash_map 容器中hash桶的个数。桶个数越多hash函数发生冲突的概率就越小重新申请内存的概率就越小。n越大效率越高但是内存消耗也越大。 const_iterator find(const key_type k) const. 用查找输入为键值返回为迭代器。 data_type operator[](const key_type k) . 这是我最常用的一个函数。因为其特别方便可像使用数组一样使用。不过需要注意的是当你使用[key ]操作符时如果容器中没有key元素这就相当于自动增加了一个key元素。因此当你只是想知道容器中是否有key元素时你可以使用find。如果你希望插入该元素时你可以直接使用[]操作符。 insert 函数。在容器中不包含key值时insert函数和[]操作符的功能差不多。但是当容器中元素越来越多每个桶中的元素会增加为了保证效率hash_map会自动申请更大的内存以生成更多的桶。因此在insert以后以前的iterator有可能是不可用的。 erase 函数。在insert的过程中当每个桶的元素太多时hash_map可能会自动扩充容器的内存。但在sgi stl中是erase并不自动回收内存。因此你调用erase后其他元素的iterator还是可用的。 3 相关hash容器 hash 容器除了hash_map之外还有hash_set, hash_multimap, has_multiset, 这些容器使用起来和set, multimap, multiset的区别与hash_map和map的区别一样我想不需要我一一细说了吧。 4 其他 这里列几个常见问题应该对你理解和使用hash_map比较有帮助。 4.1 hash_map和map的区别在哪里 构造函数。hash_map需要hash函数等于函数map只需要比较函数(小于函数). 存储结构。hash_map采用hash表存储map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。 4.2 什么时候需要用hash_map什么时候需要用map? 总体来说hash_map 查找速度会比map快而且查找速度基本和数据数据量大小属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小hash还有hash函数的耗时明白了吧如果你考虑效率特别是在元素达到一定数量级时考虑考虑hash_map。但若你对内存使用特别严格希望程序尽可能少消耗内存那么一定要小心hash_map可能会让你陷入尴尬特别是当你的hash_map对象特别多时你就更无法控制了而且hash_map的构造速度较慢。 现在知道如何选择了吗权衡三个因素: 查找速度, 数据量, 内存使用。 这里还有个关于hash_map和map的小故事看看:http://dev.csdn.net/Develop/article/14/14019.shtm 4.3 如何在hash_map中加入自己定义的类型? 你只要做两件事, 定义hash函数定义等于比较函数。下面的代码是一个例子 -bash-2.05b$ cat my.cpp #include hash_map #include string #include iostream using namespace std; //define the class class ClassA{ public: ClassA(int a):c_a(a){} int getvalue()const { return c_a;} void setvalue(int a){c_a;} private: int c_a; }; //1 define the hash function struct hash_A{ size_t operator()(const class ClassA A)const{ // return hashint(classA.getvalue()); return A.getvalue(); } }; //2 define the equal function struct equal_A{ bool operator()(const class ClassA a1, const class ClassA a2)const{ return a1.getvalue() a2.getvalue(); } }; int main() { hash_mapClassA, string, hash_A, equal_A hmap; ClassA a1(12); hmap[a1]I am 12; ClassA a2(198877); hmap[a2]I am 198877; couthmap[a1]endl; couthmap[a2]endl; return 0; } -bash-2.05b$ make my c -O -pipe -marchpentiumpro my.cpp -o my -bash-2.05b$ ./my I am 12 I am 198877 4.4如何用hash_map替换程序中已有的map容器 10;这个很容易但需要你有良好的编程风格。建议你尽量使用typedef来定义你的类型10; typedef mapKey, Value KeyMap;当你希望使用hash_map来替换的时候只需要修改: typedef hash_mapKey, Value KeyMap;其他的基本不变。当然你需要注意是否有Key类型的hash函数和比较函数。 4.5为什么hash_map不是标准的 具体为什么不是标准的我也不清楚有个解释说在STL加入标准C之时hash_map系列当时还没有完全实现以后应该会成为标准。如果谁知道更合理的解释也希望告诉我。但我想表达的是正是因为hash_map不是标准的所以许多平台上安装了g编译器不一定有hash_map的实现。我就遇到了这样的例子。因此在使用这些非标准库的时候一定要事先测试。另外如果考虑到平台移植还是少用为佳。 4.6 有学习使用hash_map的建议吗 hash中文是哈希也成为散列听见别人说散列容器不要埋怨自己孤陋寡闻。了解hash系列你还可以看看这篇文章:effective STL 25: 熟悉非标准散列容器, 另外建议查看源代码。如果还有问题那么你可以在STL论坛上提问会有高手回答你的。 5 参考文章: 详细解说 STL 排序(Sort) 详细解说 STL string Effective STL 中文版 论坛讨论:STL论坛: 详细解说STL hash_map系列 内容来自于http://www.stlchina.org
http://www.zqtcl.cn/news/286806/

相关文章:

  • 建立网站的内容规划长沙网络推广哪家
  • 网站建设及优化教程百度网站优化排名
  • 医院网站推广渠道网站关键词排名不稳定
  • 类网站建设陕西省建设资格注册中心网站
  • 网站横幅图片网页设计怎么创建站点
  • 网站建设页面设计图片开个送快餐网站怎么做
  • 北京免费网站建设模板下载南江县建设局网站
  • 温岭手机网站建设义乌市网站建设
  • 西安网站制作费用哪家装修公司比较好的
  • 硅谷网站开发薪酬wordpress热门吗
  • 红酒营销型网站建设天一建设网站
  • 做网站建设公司哪家好安徽省住房建设部官方网站
  • 网站被黑咋样的柳州正规网站制作公司哪家好
  • 莱芜网站开发代理四川网络推广服务
  • 应该知道的网站网站全网建设莱芜
  • 北京网站页设计制作广州专业网站改版
  • 重庆网站建设建站收费免费外链网盘
  • 做加盟代理的网站比较好的网页网站设计
  • 兴义网站开发企业标准备案平台官网
  • 蓝彩网络科技_齐齐哈尔微信营销_齐齐哈尔网站建设会员卡管理系统哪里买
  • 织梦门户网站做大后建个人免费网站用哪个
  • 深圳市建设管理中心西安官网seo
  • 网站开发工作方案自己做的网站怎么维护
  • 潍坊建设部门管理网站做网站如何接单
  • 定制高端网站建设设计建立的近义词
  • 企业网站建设进度邢台163官网
  • 17做网店网站池尾替代wordpress 搜索
  • 网站建设资料 优帮云商品分类标准
  • 鄂尔多斯 网站建设俐侎族网站建设背景
  • 佛山专业网站建设公司上海公司官网