精华内容
下载资源
问答
  • #include "stdafx.h" #include <iostream><br />#include <string><br />#include <vector><br />#include <list><br />using namespace std; <br />int hash(const string& str , int ...

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <vector>
    #include <list>

    using namespace std;


    int hash(const string& str , int hashTableSize)
    {
     int hasVal = 0;
     for ( int i =0 ;i < str.size() ;i++)
     {
      hasVal += str[i];
     }
     return hasVal%hashTableSize;
    }

    int hash (int keys)
    {
     return keys;
    }

    class Employee
    {
    public:
     const string & getName() {return name;}
     bool operator == (const Employee& rhs)const
     {
      return getName() == rhs.getName();
     }
     bool operator != (const Employee& rhs)const
     {
      return !(*this == rhs);
     }
    private:
     string name;
     double salary;
     int seniority;
    };

    int hash(const Employee& item)
    {
     return hash(item.getName());
    }

    template <typename HashedObj>
    class HashTable
    {
    public:
     explicit HashTable(int size = 101);
     bool contains(const HashedObj & x)const;
     void makeEmpty();
     void insert(const HashedObj & x);
     void remove(const HashedObj & x);
    private:
     vector<list<HashedObj> > theLists;
     int currentSize;

     void rehash();

     int myhash(const HashedObj & x)const;
    };

    void HashTable::makeEmpty()
    {
     for ( int i =0 ;i < theLists.size(); i++)
     {
      theLists[i].clear();
     }
    }


    bool HashTable::contains(const HashedObj & x)const
    {
     const list<HashedObj> & whichlist = theLists[ myhash(x) ];
     return find(whichlist.begin(), whichlist.end(),x)!=whichlist.end();
    }

    bool HashTable::remove(const HashedObj& x)
    {
     list< HashedObj>& whichlist = theLists[ myhash(x)];
     list<HashedObj>::iterator iter = find ( whichlist.begin(),whichlist.end(),x);
     if ( iter == whichlist.end())
     {
      return false;
     }
     else
     {
      whichlist.erase(iter);
     }
     --currentSize;
     return true;
    }

    bool HashTable::insert(const HashedObj &x)
    {
     list<HashedObj>& whichlist = theLists[hash(HashedObj& x)];
     if ( find(whichlist.begin(),whichlist.end(),x) == whichlist.end())
     {
      whichlist.push_back(x);
     }
     else
     {
      return false;
     }
     if ( ++currentSize > theLists.size())
     {
      rehash();
     }
     return true;
    }

     

    void main(void)
    {

    }

    展开全文
  • c++STL容器unordered_set、unordered_map、unordered_multiset、unordered_multimap内部是用哈希表实现的,以下将详细介绍c++STL哈希表的实现。 二、哈希表排列结构 1、哈希表buckets个数大于元素个数,当元素...

    一、简介

    c++STL容器unordered_set、unordered_map、unordered_multiset、unordered_multimap内部是用哈希表实现的,以下将详细介绍c++STL哈希表的实现。


    二、哈希表排列结构

    1、哈希表buckets个数大于元素个数,当元素个数大于等于buckets个数时,哈希表将rebuild,扩大buckets个数,GNU C2.9 buckets个数增量表如下图所示,默认为53,增量为质素,大小因编译器不同可能不一样。

    2、哈希表中key不能被改变,数据可以更改。

    3、哈希命中到同一位置,将以链式存储元素。



    三、代码分析

    1、GNU C 2.9实现模板hashtable需要传入6个参数,

    Value:数据+键值

    Key:键值

    HashFun:哈希函数,用以返回一个哈希值,再经过运算得到元素存放位置

    ExtractKey:从value中提取key

    EquelKey:比较key的方式

    Alloc:分配器



    四、哈希表应用

    1、直接运用容器的hashtable,传入相应参数,添加元素到哈希表中。



    五、STL容器unordered_set的哈希表应用

    1、unordered_set、unordered_map、unordered_multiset、unordered_multimap模板定义,内部均使用了hashtable。


    2、unordered_set容器使用。


    展开全文
  • C++STL哈希表

    2021-01-01 22:17:16
    C++ STL中,哈希表对应的容器是unordered_map(since C++ 11)。根据 C++ 11 标准的推荐,用unordered_map代替hash_map。 哈希表 先来回顾一下数据结构中哈希表相关的知识。 哈希表是根据关键码值(key value)而...

    C++ STL中,哈希表对应的容器是 unordered_map(since C++ 11)。根据 C++ 11 标准的推荐,用 unordered_map 代替 hash_map

    哈希表

    先来回顾一下数据结构中哈希表相关的知识。

    哈希表是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数。

    哈希表的一个重要问题就是如何解决映射冲突的问题。常用的有两种:开放地址法 和 链地址法

    STL中,map 对应的数据结构是 红黑树。红黑树是一种近似于平衡的二叉查找树,里面的数据是有序的。在红黑树上做查找操作的时间复杂度为 O(logN)。而 unordered_map 对应 哈希表,哈希表的特点就是查找效率高,时间复杂度为常数级别 O(1), 而额外空间复杂度则要高出许多。所以对于需要高效率查询的情况,使用 unordered_map 容器。而如果对内存大小比较敏感或者数据存储要求有序的话,则可以用 map 容器。

    说明

    • unordered_map 是一种关联容器,用于存储由关键值 (Key Value,以下称为Key 值) 和映射值 (Mapped Value,以下称为映射值) 组成的元素,并且允许根据其 Key 值快速检索各个元素。

    • 在 unordered_map 容器中,Key 值通常用来唯一标识元素,映射值是与该 Key 值关联内容的对象。Key 值与映射值的类型可能不同。

    • 在 unordered_map 内部,元素没有按照其 Key 值与映射值的任何顺序进行排序 ,而是根据它们的 Hash 值组织成桶,允许它们通过其 Key 值直接快速访问单个元素(通常具有常数等级的平均时间复杂度)。

    • unordered_map 容器与 map 容器相比,通过 Key 值访问各个元素的速度更快,然而通过其元素子集进行范围迭代的效率通常较低。

    • unordered_map 实现了直接访问操作符 (operator[]),它允许使用 Key 值作为输入参数,直接访问映射值。

    • 容器中的迭代器至少是前向迭代器。

      容器属性

      关联性
      关联容器中的元素的参考地址指的是其 Key 值,而不是他们在容器中的绝对地址;
      无序性
      无序容器使用 Hash 表来组织元素,这些 Hash 表允许无序容器通过 Key 值快速访问元素;
      映射
      每个元素将一个 Key 值与映射值关联起来,Key 值用于标识其主要内容是映射值的元素;
      唯一关键值
      容器中不存在同时拥有相同 Key 值的两个元素;
      分配器感知

      map 容器使用分配器对象动态处理其存储需求。

    常用函数

    bucket

    size_type bucket ( const key_type& k ) const;

    定位元素所在的桶,返回 Key 值为输入参数 k 的元素的所在桶号。
    桶是容器内部 Hash 表中的一个槽,槽中的元素根据 Key 值分配元素。桶号的编号从 0 到 (bucket_count - 1)。 桶中单个元素可以通过 unordered_map::begin 和 unordered_map::end 返回的范围迭代器进行访问。

    count

    size_type count ( const key_type& k ) const;

    搜索容器中 Key 值为输入参数 k 的元素,并返回找到元素的数量。由于 unordered_map 容器不允许存在重复的 Key 值,这说明如果容器中存在具有该 Key 值的元素,则该函数返回 1,否则返回 0。

    clear

    清除 map 中所有元素;

    erase

    删除 map 中指定位置的元素;

    insert

    在 map 指定位置添加 pair 类型的元素;

    find

    获取 map 中元素的迭代器;

    begin, end

    map 的正向迭代器的起始位置与终点位置

    例题

    摘选自 Leetcode 问题 Two Sum:给出一个整数数组,返回两个数的下标值,令其和等于一个指定的目标值。

    #include <unordered_map>
    class Solution {
    public:
        vector<int> twoSum(vector<int> &numbers, int target)
        {
            //Key is the number and value is its index in the vector.
            unordered_map<int, int> hash;
            vector<int> result;
            for (int i = 0; i < numbers.size(); i++) {
                int numberToFind = target - numbers[i];
    
                //if numberToFind is found in map, return them
                if (hash.find(numberToFind) != hash.end()) {
                    result.push_back(hash[numberToFind]);
                    result.push_back(i);            
                    return result;
                }
    
                //number was not found. Put it in the map.
                hash[numbers[i]] = i;
            }
            return result;
        }
    };

    参考“大专栏”

    展开全文
  • 哈希表 - 用法 我提供了在 Java,C++ 和 Python 中使用哈希集的示例。 如果你不熟悉哈希集的用法,那么通过这一示例将会很有帮助。 //C++ #include <iostream> #include <unordered_set> // 0. include ...

    哈希表 - 用法

    我提供了在 Java,C++ 和 Python 中使用哈希集的示例。 如果你不熟悉哈希集的用法,那么通过这一示例将会很有帮助。

    //C++
    #include <iostream>
    #include <unordered_set>                // 0. include the library
    
    int main() {
        // 1. initialize a hash set
        unordered_set<int> hashset;   
        // 2. insert a new key
        hashset.insert(3);
        hashset.insert(2);
        hashset.insert(1);
        // 3. delete a key
        hashset.erase(2);
        // 4. check if the key is in the hash set
        if (hashset.count(2) <= 0) {
            cout << "Key 2 is not in the hash set." << endl;
        }
        // 5. get the size of the hash set
        cout << "The size of hash set is: " << hashset.size() << endl; 
        // 6. iterate the hash set
        for (auto it = hashset.begin(); it != hashset.end(); ++it) {
            cout << (*it) << " ";
        }
        cout << "are in the hash set." << endl;
        // 7. clear the hash set
        hashset.clear();
        // 8. check if the hash set is empty
        if (hashset.empty()) {
            cout << "hash set is empty now!" << endl;
        }
    }
    
    //java
    // "static void main" must be defined in a public class.
    public class Main {
        public static void main(String[] args) {
            // 1. initialize the hash set
            Set<Integer> hashSet = new HashSet<>();     
            // 2. add a new key
            hashSet.add(3);
            hashSet.add(2);
            hashSet.add(1);
            // 3. remove the key
            hashSet.remove(2);        
            // 4. check if the key is in the hash set
            if (!hashSet.contains(2)) {
                System.out.println("Key 2 is not in the hash set.");
            }
            // 5. get the size of the hash set
            System.out.println("The size of has set is: " + hashSet.size());     
            // 6. iterate the hash set
            for (Integer i : hashSet) {
                System.out.print(i + " ");
            }
            System.out.println("are in the hash set.");
            // 7. clear the hash set
            hashSet.clear();
            // 8. check if the hash set is empty
            if (hashSet.isEmpty()) {
                System.out.println("hash set is empty now!");
            }
        }
    }
    
    #python
    # 1. initialize the hash set
    hashset = set() 
    # 2. add a new key
    hashset.add(3)
    hashset.add(2)
    hashset.add(1)
    # 3. remove a key
    hashset.remove(2)
    # 4. check if the key is in the hash set
    if (2 not in hashset):
        print("Key 2 is not in the hash set.")
    # 5. get the size of the hash set
    print("Size of hashset is:", len(hashset)) 
    # 6. iterate the hash set
    for x in hashset:
        print(x, end=" ")
    print("are in the hash set.")
    # 7. clear the hash set
    hashset.clear()                         
    print("Size of hashset:", len(hashset))
    
    展开全文
  • hashset和hashmap都是hashtable的一种实现形式。 接下来我要介绍的unordered_set和unordered_map都是基于hashtable的实现。 unordered_set实现了不存储重复的元素。 unordered_map实现了key和value的映射。...
  • [Z]C++ STL哈希表 hash_map介绍 - waytofall - 博客园C++ STL哈希表 hash_map介绍0 为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和...
  • C++ STL哈希表Map 与 hash_map 介绍 标签: Maphash_mapstl map 转载地址:http://blog.csdn.net/txl199106/article/details/51074791 目录(?)[+] 0 为什么需要hash_map1 数据结构hash_...
  • C++ STL哈希表

    2014-04-23 16:56:02
    哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的 情况下,用空间换时间的做法是值得的。另外,编码比较容易...
  • C++ STL哈希表 hash_map从头到尾详细介绍 标签: stlmaphashhashmap 2015-06-26 19:49 1750人阅读 评论(0) 收藏 举报  分类: STL(13)  目录(?)[+] 0 为什么需要hash_...
  • C++ STL哈希表 hash_map

    千次阅读 2011-05-01 16:45:00
      对海量数据进行处理的时候经常要使用hash_map,java里使用hash_map比较简单,下面将介绍C++ STL哈希表 hash_map的使用方法,主要内容引用下面链接内容。 ...
  • 2. C++ STL哈希表 hash_map从头到尾详细介绍     Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到相关的内容,就正好复习一下。网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟...
  • C++ STL源码剖析之哈希表0.导语哈希表,是作为unordered_map与undered_set等的底层容器,自gcc2.9后源码量大增!这次阅读的代码仍旧是gcc...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 455
精华内容 182
关键字:

c++stl哈希表

c++ 订阅