C++ 具有禁止碰撞的无序_映射

C++ 具有禁止碰撞的无序_映射,c++,optimization,hash,c++-standard-library,C++,Optimization,Hash,C++ Standard Library,我想实现一个性能优化的unordered_map变体,它分几个阶段工作: 初始化:在std::map 准备:做一些魔术,将std::map转换为std::unordered\u map 工作:执行大量(无限)的查找;禁止插入/删除 为了使“工作”阶段尽可能快,我想选择一个哈希函数,该函数对于给定的一组键(在初始化阶段收集)没有冲突 我想衡量一下我能从这个技巧中获得多少性能改进。所以这将是一个实验,可能进入生产代码 标准库是否有用于此实现的工具(例如,查找给定的无序映射有多少冲突;或更改哈希函数)

我想实现一个性能优化的
unordered_map
变体,它分几个阶段工作:

  • 初始化:在
    std::map
  • 准备:做一些魔术,将
    std::map
    转换为
    std::unordered\u map
  • 工作:执行大量(无限)的查找;禁止插入/删除
  • 为了使“工作”阶段尽可能快,我想选择一个哈希函数,该函数对于给定的一组键(在初始化阶段收集)没有冲突

    我想衡量一下我能从这个技巧中获得多少性能改进。所以这将是一个实验,可能进入生产代码


    标准库是否有用于此实现的工具(例如,查找给定的
    无序映射有多少冲突;或更改哈希函数)?或者我应该自己实现吗?

    冲突的数量取决于存储桶的数量。使用rehash函数将存储桶数设置为100是否有用?

    如果读取次数多,写入次数少,可以使用矢量作为映射。这是非常常见的,因为
    下限
    映射
    更有效,并且使用更少的内存空间:

    bool your_less_function( const your_type &a, const your_type &b )
    {
      // based on keys
      return ( a < b );
    }
    ...
    std::vector<your_type> ordered-vector;
    
    询问数据时:

    std::vector<your_type>::iterator iter = std::lower_bound( ordered-vector.begin(), ordered-vector.end(), value, your_less_function );
    if ( ( iter == ordered-vector.end() ) || your_less_function( *iter, value ) )
      // you did not find the value
    else
      // iter contains the value
    
    std::vector::iterator iter=std::lower_bound(ordered vector.begin(),ordered vector.end(),value,您的_less_函数);
    if((iter==ordered vector.end())| |你的_less_函数(*iter,value))
    //您没有找到值
    其他的
    //iter包含了这个值
    
    不幸的是,它已订购,但速度非常快。

    以下是“冲突管理”API:

    简而言之,
    bucket\u size(n)
    提供第n个bucket的碰撞次数。您可以使用键查找存储桶,也可以使用本地迭代器对存储桶进行迭代


    对于更改哈希函数,我将分配/构造一个新容器,从旧的哈希函数到新的。

    看看gperf以生成完美的哈希函数(当然,如果希望哈希完美,您需要将所有输入都交给它…)我相当肯定gperf在编译时需要知道完整的项集。那么使用现有的方法(比如完美散列)怎么样?由于表中只有100个条目,在
    下限
    中通过二进制搜索进行比较应该很快。不过,一个简单的散列可能会更快。
    std::vector<your_type>::iterator iter = std::lower_bound( ordered-vector.begin(), ordered-vector.end(), value, your_less_function );
    if ( ( iter == ordered-vector.end() ) || your_less_function( *iter, value ) )
      // you did not find the value
    else
      // iter contains the value
    
    size_type bucket_count() const;
    size_type max_bucket_count() const;
    
    size_type bucket_size(size_type n) const;
    size_type bucket(const key_type& k) const;
    
    local_iterator       begin(size_type n);
    local_iterator       end(size_type n);
    const_local_iterator begin(size_type n) const;
    const_local_iterator end(size_type n) const;
    const_local_iterator cbegin(size_type n) const;
    const_local_iterator cend(size_type n) const;