数据结构:C++ STL 哈希表(unordered_map)
数据结构:C++ STL 哈希表(unordered_map)unordered_map 容器,直译过来就是"无序 map 容器"的意思。所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。换句话说,unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。1.
数据结构:C++ STL 哈希表(unordered_map)
unordered_map
容器,直译过来就是"无序 map 容器
"的意思。所谓“无序”,指的是 unordered_map
容器不会像 map
容器那样对存储的数据进行排序。换句话说,unordered_map
容器和 map
容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map
容器中是无序的。
1.哈希表创建
-
unordered_map
头文件; -
unordered_map<T,T> map
#include <unordered_map>//头文件
unordered_map<int,int> map;
//直接赋值
unordered_map<int,int> map2{
{1,2},
{2,3},
{3,4}
}
//复制构造函数
unordered_map<int,int> map3(map2);
//通过迭代器赋值
unordered_map<int,int> map4(map3.begin()+1,map3.end());
2.添加函数
-
insert(pair<key,value>(a,b))
通过insert函数进行插入值; -
map[key]=value
通过下标进行插入赋值; -
emplace(pair<key,value>(a,b)
比insert()
效率高
注意的是,
emplace()
方法的返回值为 pair 类型值,其包含一个迭代器和一个 bool 类型值:
- 当 emplace() 成功添加新键值对时,返回的迭代器指向新添加的键值对,bool 值为 True;
- 当 emplace() 添加新键值对失败时,说明容器中本就包含一个键相等的键值对,此时返回的迭代器指向的就是容器中键相同的这个键值对,bool 值为 False。
iterator emplace_hint ( iterato, Args&&... args);
和 emplace() 方法相同,emplace_hint() 方法内部会自行构造新键值对,因此我们只需向其传递构建该键值对所需的 2 个元素(第一个作为键,另一个作为值)即可。不同之处在于:
- emplace_hint() 方法的返回值仅是一个迭代器,而不再是 pair 类型变量。当该方法将新键值对成功添加到容器中时,返回的迭代器指向新添加的键值对;反之,如果添加失败,该迭代器指向的是容器中和要添加键值对键相同的那个键值对。
- emplace_hint() 方法还需要传递一个迭代器作为第一个参数,该迭代器表明将新键值对添加到容器中的位置。需要注意的是,新键值对添加到容器中的位置,并不是此迭代器说了算,最终仍取决于该键值对的键的值。
map.insert(pair<int,int>(1,10));
map.emplace(key,value);
map[1]=10;
3.成员函数
-
find()
查找函数 -
erase(iterator)
删除指定元素 -
erase(key)
删除指定key值的元素 -
empty()
判空函数 -
size()
大小函数 -
clear()
清空哈希表 -
swap()
交换函数
if(m.find(2)!=m.end()){}//如果找到了2 没找到的话返回值为end()
map.erase(map.begin());//删除第一个元素
map.erase(10);//删除值为10的键值对
bool isEmpty = map.empty();
int size = map.size();
map.clear();//清空map
swap(map1,map2);
map1.swap(map2);
4.哈希表的遍历
for(unordered_map::iterator it = map.begin();it!=map.end();it++){
int front = it->first;//key
int end = it->second;//value
}
5.函数表
成员方法 | 功能 |
---|---|
begin() | 返回指向容器中第一个键值对的正向迭代器。 |
end() | 返回指向容器中最后一个键值对之后位置的正向迭代器。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。 |
empty() | 若容器为空,则返回 true;否则 false。 |
size() | 返回当前容器中存有键值对的个数。 |
max_size() | 返回容器所能容纳键值对的最大个数,不同的操作系统,其返回值亦不相同。 |
operator[key] | 该模板类中重载了 [] 运算符,其功能是可以向访问数组中元素那样,只要给定某个键值对的键 key,就可以获取该键对应的值。注意,如果当前容器中没有以 key 为键的键值对,则其会使用该键向当前容器中插入一个新键值对。 |
at(key) | 返回容器中存储的键 key 对应的值,如果 key 不存在,则会抛出 out_of_range 异常。 |
find(key) | 查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。 |
count(key) | 在容器中查找以 key 键的键值对的个数。 |
equal_range(key) | 返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中键为 key 的键值对所在的范围。 |
emplace() | 向容器中添加新键值对,效率比 insert() 方法高。 |
emplace_hint() | 向容器中添加新键值对,效率比 insert() 方法高。 |
insert() | 向容器中添加新键值对。 |
erase() | 删除指定键值对。 |
clear() | 清空容器,即删除容器中存储的所有键值对。 |
swap() | 交换 2 个 unordered_map 容器存储的键值对,前提是必须保证这 2 个容器的类型完全相等。 |
bucket_count() | 返回当前容器底层存储键值对时,使用桶(一个线性链表代表一个桶)的数量。 |
max_bucket_count() | 返回当前系统中,unordered_map 容器底层最多可以使用多少桶。 |
bucket_size(n) | 返回第 n 个桶中存储键值对的数量。 |
bucket(key) | 返回以 key 为键的键值对所在桶的编号。 |
load_factor() | 返回 unordered_map 容器中当前的负载因子。负载因子,指的是的当前容器中存储键值对的数量(size())和使用桶数(bucket_count())的比值,即 load_factor() = size() / bucket_count()。 |
max_load_factor() | 返回或者设置当前 unordered_map 容器的负载因子。 |
rehash(n) | 将当前容器底层使用桶的数量设置为 n。 |
reserve() | 将存储桶的数量(也就是 bucket_count() 方法的返回值)设置为至少容纳count个元(不超过最大负载因子)所需的数量,并重新整理容器。 |
hash_function() | 返回当前容器使用的哈希函数对象。 |
更多推荐
所有评论(0)