11.4 无序容器

文章目录

      • 使用无序容器
      • 管理桶

无序关联容器使用哈希函数和关键字类型的==运算符组织元素。

使用无序容器

#include
#include

using namespace std;

int main() 
{
	unordered_map<string, int> words;
	string word;
	while (cin>>word)
	{
		if (!words.insert(pair<string,int>( word,1)).second )
		{
			++words[word];
		}
	}
	for (auto i : words)
		cout << i.first << "  " << i.second << endl;
	return 0;
}

使用的方法也和正常的map是一致的。

但是需要注意的是:提供和有序容器相同的操作(find、insert等),输出可能不同(不按字典序排序,按哈希函数排序 ),有序和无序通常可以互相替换。

管理桶

无序容器在存储上组织为一组桶,每个桶保存0~多个元素。无序容器使用一个哈希函数将元素映射到桶。每个桶保存一个特定哈希值,如果允许重复关键字,则具有相同关键字的元素也在一个桶中。

无序容器性能依赖于哈希函数的质量和桶的数量和大小。

哈希函数能将特定的值映射到唯一的桶。也可以将不同关键字的元素映射到相同的桶。当一个桶保存多个元素时,采用顺序搜索插入元素。(即桶外无序,桶内顺序)

//桶接口
c.bucket_count() //正使用桶数目
c.max_bucket_count() //容器对桶数目的容量
c.bucket_size(n) //第n个桶元素数
c.bucket(k) //关键字k在哪个桶中

//桶迭代
local_iterator //访问桶中元素的迭代器类型
const_local_iterator //const版本
c.begin(n),c.end(n)
c.cbegin(n),c.cend(n)

//哈希策略
c.load_factor() //每个桶平均数量,返回float值
c.max_load_factor() //c维护平均桶大小,返回float值。c会在需要的时候添加新桶,使得c.load_factor<=c.max_load_factor.
c.rehash(n) //重组存储,bucket_count>=n&&bucket_count*max_load_factor>size
c.reserve(n) //重组存储,c可以保存n个元素且不rehash

无序容器使用关键字类型的==运算符比较元素,通过hash类型的对象来生成每个元素的哈希值。标准库为内置类型替供了hash模板。

你可能感兴趣的:(C++,哈希算法,散列表,算法,c++)