在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可以达到log_2 N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式 基本类似,只是底层结构不同。
unordered_map特点
- unordered_map是存储<key, value>键值对的关联式容器,其允许通过Keys快速的索引到与其对应的value。
- 在unordered_map中,键值通常用于唯一 地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
- 在内部,unordered_map没有对<key,value>按照任何特定的顺序排序,为了能在常数时间内找到所对应的value,unordered_map将相同哈希值的键值放在相同的桶中。
- unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。
- unordered_map实现了直接访问操作符([]),他允许使用key作为参数直接访问value。
- 他的迭代器至少是前向迭代器
构造函数
函数名称 | 功能介绍 |
---|
unordered_map | 构造不同格式的unordered_map |
容量
函数名称 | 功能介绍 |
---|
bool empty() const | 检测unordered_map是否为空 |
size_t size()const | 获取unordered_map的有效元素的个数 |
元素访问
函数名称 | 功能介绍 |
---|
operator[] | 返回与key对应的value |
注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶中插入,如果key不在哈希桶中,插入成功,返回V(),否则插入失败,说明key已经在哈希桶中,将key对应的value返回
查询
函数名称 | 功能介绍 |
---|
iterator find(const K&key) | 返回key在哈希桶中的位置 |
size_t count(const K&key) | 返回哈希桶中关键码为key的键值对的个数 |
注意:unordered_map中key是不能重复的,因此count函数的返回值最大为1
修改操作
函数名称 | 功能介绍 |
---|
insert | 向容器中插入键值对 |
erase | 删除容器中的键值对 |
void clear() | 清空容器中有效元素个数 |
void swap(unordered_map &) | 交换两个容器中的元素 |
桶操作
函数名称 | 功能介绍 |
---|
size_t bucket_count()const | 返回哈希桶中桶的总个数 |
size_t bucket_size(size_t n)const | 返回n号桶中有效元素的总个数 |
size_t bucket(const K& key) | 返回元素key所在的桶号 |
找到数组中出现次数为times的元素
class Solution{
public:
int static repeatedNTimes(vector<int> &A, int times)
{
// 用unordered_map统计每个元素出现的次数
unordered_map<int,int> m;
for(auto e : A)
{
m[e]++;
}
// 找出出现次数为N的元素
for(auto &e : m)
{
if(e.second == times)
{
return e.first;
}
}
return 0;
}
找出两个字符串中出现次数为1的单词
static vector<string> uncommonFromSentences(string first, string second)
{
unordered_map<string, int> m;
PartionWord(first, m);
PartionWord(second, m);
vector<string> vRet;
for(auto &e : m)
{
if(1 == e.second)
{
vRet.push_back(e.first);
}
}
return vRet;
}
static void PartionWord(const string &str, unordered_map<string,int> &m)
{
string strWord;
int start = 0;
int last = 0;
do
{
last = str.find(' ', start);
strWord = str.substr(start, last - start);
m[strWord]++;
start = last + 1;
}while(last != -1);
}