扩展阅读
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • Linux c字符串中不可打印字符转换成16进制
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • linux c下利用srand和rand函数生成随机字符串
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux下chmod命令详细介绍及用法举例
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Linux下c基于openssl生成MD5的函数
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • linux僵尸(zombie)进程介绍及清除
  • Windows2000和Linux双操作系统,Linux系统有问题,我直接把Linux分区删除后,Windows2000进不去了,怎么办???
  •  
    当前位置:  编程语言>c/c++开源软件 iis7站长之家

    linux下c/c++使用hash_map方法介绍

     
        发布时间:2013-10-20  


        本文导语:  hash_map基于hash table(哈希表)。哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时...

       hash_map基于hash table哈希表)。哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。

       其基本原理是:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“”所对应的地方,称为桶。但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突”,换句话说,就是把不同的元素分在了相同的“类”之中。 总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。

    hash_map,首先分配一大片内存,形成许多桶。是利用hash函数,对key进行映射到不同区域(桶)进行保存。其插入过程是:

      1. 得到key

      2. 通过hash函数得到hash值

      3. 得到桶号(一般都为hash值对桶数求模)

      4. 存放key和value在桶内。

    取值过程是:

      1. 得到key

      2. 通过hash函数得到hash值

      3. 得到桶号(一般都为hash值对桶数求模)

      4. 比较桶的内部元素是否与key相等,若都不相等,则没有找到。

      5. 取出相等的记录的value。

       hash_map中直接地址用hash函数生成,解决冲突,用比较函数解决。这里可以看出,如果每个桶内部只有一个元素,那么查找的时候只有一次比较。当许多桶内没有值时,许多查询就会更快了(指查不到的时候).

      由此可见,要实现哈希表, 和用户相关的是:hash函数和比较函数。这两个参数刚好是我们在使用hash_map时需要指定的参数。

      hash_map不是c++标准库的一部分,但因其重要性很多库(如sgi stlboost等)实现了hash_map,包括g++编译器所带的头文件也包含了hash_map的实现代码(其实现为sgi stl的版本),其在include/ext目录下,该目录还包含了hash_setrope等的实现。

    // 文件/usr/include/c++/4.4.0/ext/hash_map
    _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
     using std::equal_to;
     using std::allocator;
     using std::pair;
     using std::_Select1st;
     /**
     * This is an SGI extension.
     * @ingroup SGIextensions
     * @doctodo
     */
     template<class _Key, class _Tp, class _HashFn = hash<_Key>,
     class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> >
     class hash_map

      首先从上述头文件开始的部分可以发现,hash_map定义在__gnu_cxx命名空间中,故你必须在使用时限定名字空间__gnu_cxx::hash_map,或者使用using关键字,如下例:

    #include <ext/hash_map>
    using namespace __gnu_cxx;
    int main()
    {
        hash_map<int, string> hm;
        /* 其它使用hash_map的代码 */
    }

    hash_map的函数和map的函数差不多。具体函数的参数和解释,请参看:STL 编程手册:Hash_map,这里主要介绍几个常用函数。

      1. hash_map(size_type n) 如果讲究效率,这个参数是必须要设置的。n 主要用来设置hash_map 容器中hash桶的个数。桶个数越多,hash函数发生冲突的概率就越小,重新申请内存的概率就越小。n越大,效率越高,但是内存消耗也越大。

      2. const_iterator find(const key_type& k) const. 用查找,输入为键值,返回为迭代器

      3. data_type& operator[](const key_type& k) . 这是我最常用的一个函数。因为其特别方便,可像使用数组一样使用。不过需要注意的是,当你使用[key ]操作符时,如果容器中没有key元素,这就相当于自动增加了一个key元素。因此当你只是想知道容器中是否有key元素时,你可以使用find。如果你希望插入该元素时,你可以直接使用[]操作符。

      4. insert 函数。在容器中不包含key值时,insert函数和[]操作符的功能差不多。但是当容器中元素越来越多,每个桶中的元素会增加,为了保证效率,hash_map会自动申请更大的内存,以生成更多的桶。因此在insert以后,以前的iterator有可能是不可用的。

      5. erase 函数。在insert的过程中,当每个桶的元素太多时,hash_map可能会自动扩充容器的内存。但在sgi stl中是erase并不自动回收内存。因此你调用erase后,其他元素的iterator还是可用的。

       hash_map本身以前本身不属于标准库,是后来引入的,在不同版本的Linux系统下使用遇到问题时,需要考虑以下两种情况:

      一种可能它被放在了stdext名空间里,那么你就要使用using namespace stdext 引入该名空间并#include <hash_map>;.

      另一种可能就是它被放在了标准库的ext目录底下,仍旧属于std名空间.这时你的源文件应当包含头文件

    #include <ext/hash_map>;

    如果不知道的话.可以使用切换到你的stl库目录底下cd /usr/include/c++/版本

    然后grep -iR "hash_map" ./

    查看在哪个文件中.一般头文件的最后几行会提示它所述的名空间。


    • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
      本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
      转载请注明:文章转载自:[169IT-IT技术资讯]
      本文标题:linux下c/c++使用hash_map方法介绍
    相关文章推荐:
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • linux支持ti-rpc么?ti-rpc在linux中是不是只使用udp协议,不能使用tcp协议
  • linux下free命令显示的内存使用情况分析
  • 求redhat linux 9.0下可以使用的oracle 10g或9i,还有redhat linux 9.0下可以使用的eclipse下载地址
  • linux下不使用sudo命令执行docker的操作步骤
  • 在XP下使用VMWare安装了Linux AS 5.6之后,使用FTP工具可以远程连接Linux,而在cmd命令行中却连接不上,什么原因 ?
  • 如何使用linux下gdb来调试python程序
  • 原来装了linux和win2k,使用LiLO启动,现在重新win2k,如何恢复使用LILO来引导使得Linux可用
  • linux/Centos/ubuntu下如何使用umask命令修改新建文件时的默认权限
  • 在shell中使用数组需要什么特殊的条件马? 怎么在有的linux下能够用,在有的linux下就不能能使用?
  • linux下objdump命令用法介绍及如何使用objdump命令进行反汇编
  • asp程序使用的access在Linux下如何使用!
  • linux下top命令详解包括top命令参数使用及结果(virt,res,shr)排序举例说明
  • [请置顶]关于Linux的安装使用问题 请放到 软件使用/操作系统 里提问
  • linux top命令详解以及top命令的各项使用技巧详细说明
  • 新装的Linux使用root用户不能使用FTP?
  • LINUX下使用Eclipse,如何使用交叉编译器?
  • linux系统下使用使用性能监视工具的前提?
  • 使用VWMARE安装linux的内存使用问题
  • 嵌入式Linux使用外挂Vsftpd不能正常使用, 请高手解答,谢谢。
  • linux下用什么命令使用怎样使用*.bin文件?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3