C++11底层是哈希结构的关联式容器?
什么是关联式容器?
KV模型,或者K模型
KV模型
给一个文件:存储IP地址,找出出现次数对做的前K条IP地址,也就是top k问题
1.统计每个ip地址出现的次数-----><IP,出现次数>键值对
2.优先级队列创建的是小堆。
K模型
给一个英文词典,检测一个单词是否拼写正确
1.将词典中的单词存储
2.在存储的单词集合中找待检测的单词是否存在
C++11中提供的四种底层是哈希桶的关联式容器
unordered_map:K-V类型的键值对,并且K是不能重复的
unordered_set:元素类型K,并且key不能重复
unordered_multimap:元素类型K-V键值对,K是可以重复
unordered_multiset:元素类型K,并且K可以重复
#include<iostream>
#include<unordered_map>
#include<unordered_multimap>
#include<string>
using namespace std;
void func()
{
unordered_map<string, string> m;
m.insert(pair<string, string>("及时雨", "松江"));
m.insert(make_pair("及时雨2", "宋江"));
//查看元素个数
cout << m.size() << endl;
//查看桶的个数
cout << m.bucket_count() << endl;
//查看第0号桶中的元素个数
cout << m.bucket_size(0) << endl;
//查看及时雨在哪个桶中
cout << m.bucket("及时雨") << endl;
cout << m.bucket("及时雨2") << endl;
//试试随机访问运算符[]
cout << m["及时雨"] << endl;
cout << m.size() << endl;
//[]:如果key不存在,<key,默认value>构建一个键值对,然后将其插入到容器中,返回默认的value,vs2013返回空
cout << m["董晨辉"] << endl;
cout << m.size() << endl;
}
void func2()
{
unordered_multimap<string, string> m;
}
int main()
{
//func();
func2();
return 0;
}
如果有一个场景就是,查询的次数比较多的话,可以考虑unordered系列,因为unordered查询效率比较高。
迭代器的分类:
遍历的方向:正向迭代器,反向迭代器:对正向迭代器的一种适配
元素修改:普通迭代器----》可以通过迭代器修改迭代器对应的数据,const类型的迭代器不可以通过迭代器修啊该迭代器对应的数据。
实现本质:原生态的指针(要想使用原生态的指针,底层必须是连续的空间) ---->比如vector,string
1G = 10亿字节
海量数据题2
注意字节是从0号字节开始计数的。
40亿整形数据映射到为题里面后有多大?
2^32 / 8 * 1024 * 1024 = 512 M
用位图排序要求数据中不能有重复的数据
1.把数据映射到位图,然后有数据的位置为1,否则为0
2.遍历位图,进行输出
上面的问题大概需要512 * 2 = 1024 M