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;