unordered_map是含有唯一key的键值对的无序关联容器,搜索、移除和插入操作是平均常数的时间复杂度。unordered_map在内部没有按任何顺序排列,而是放在桶当中的,放进哪个桶是通过计算key的hash值来决定的。
template<
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
class Allocator = std::allocator<std::pair<const Key, T>>
> class unordered_map;
本文章的代码库:
https://gitee.com/gamestorm577/CppStd
成员函数
构造、析构和赋值
构造函数
可以构造一个空的unordered_map,也可以用迭代器、另一个unordered_map或者元素列表来构造一个unordered_set。构造的时候还可以指定最小桶数、hash函数、比较函数或者分配器。代码示例:
std::unordered_map<int, float> m1;
std::unordered_map<int, float> m2{
{1, 1.1f}, {2, 1.2f}, {3, 1.3f}};
std::unordered_map<int, float> m3(m2);
std::unordered_map<int, float> m4(m2.begin(), std::next(m2.begin(), 2));
std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;
std::cout << "m3 size = " << m3.size() << std::endl;
std::cout << "m4 size = " << m4.size() << std::endl;
输出结果:
m1 size = 0
m2 size = 3
m3 size = 3
m4 size = 2
对于自定义的类型,需要定义hash函数以及比较函数。代码示例:
struct MyStruct
{
int Num1;
double Num2;
};
struct MyHash
{
std::size_t operator()(const MyStruct& val) const
{
return std::hash<int>()(val.Num1) + std::hash<double>()(val.Num2);
}
};
struct MyEqual
{
bool operator()(const MyStruct& lhs, const MyStruct& rhs) const
{
return true;
}
};
std::unordered_map<MyStruct, int, MyHash, MyEqual> m;
析构函数
销毁unordered_map时,会调用各元素的析构函数。代码示例:
struct MyStruct
{
MyStruct(int i)
: Num(i)
{
}
~MyStruct()
{
std::cout << "destruct, Num = " << Num << std::endl;
}
int Num = 0;
};
struct MyHash
{
std::size_t operator()(const MyStruct& val) const
{
return std::hash<int>()(val.Num);
}
};
struct MyEqual
{
bool operator()(const MyStruct& lhs, const MyStruct& rhs) const
{
return lhs.Num == rhs.Num;
}
};
std::unordered_map<MyStruct, float, MyHash, MyEqual> m;
m.emplace(MyStruct(1), 1.1f);
m.emplace(MyStruct(2), 2.1f);
m.emplace(MyStruct(3), 3.1f);
std::cout << "end" << std::endl;
输出结果:
destruct, Num = 1
destruct, Num = 2
destruct, Num = 3
end
destruct, Num = 3
destruct, Num = 2
destruct, Num = 1
赋值函数
可以用另一个unordered_map或者元素列表给unordered_map赋值。代码示例:
std::unordered_map<int, float> tmp{
{1, 1.1f}, {2, 1.2f}, {3, 1.3f}};
std::unordered_map<int, float> m1;
std::unordered_map<int, float> m2;
m1 = tmp;
m2 = {
{1, 1.1f}, {2, 1.2f}};
std::cout << "m1 size = " << m1.size() << std::endl;
std::cout << "m2 size = " << m2.size() << std::endl;
输出结果:
m1 size = 3
m2 size = 2
迭代器
接口begin、cbegin指向unordered_map起始的迭代器,end、cend指向末尾的迭代器。代码示例:
std::unordered_map<int, float> tmp{
{1, 1.1f}, {2, 1.2f}, {3, 1.3f}};
for (auto iter = tmp.begin(); iter != tmp.end(); ++iter)
{
iter->second += 10.f;
}
for (auto iter = tmp.cbegin(); iter != tmp.cend(); ++iter)
{
std::cout << "value = " << iter->second << std::endl;
}
输出结果:
value = 11.3
value = 11.2
value = 11.1
容量
empty
检查容器是否为空。代码示例:
std::unordered_map<int, float> m1{
{1, 1.1f}, {2, 1.2f}, {3, 1.3f}};
std::unordered_map<int, float> m2;
std::cout << std::boolalpha;
std::cout << "m1 empty: " << m1.empty() << std::endl;
std::cout << "m2 empty: " << m2.empty() << std::endl;
输出结果:
m1 empty: false
m2 empty: true
size
返回容器的元素个数。代码示例:

124

被折叠的 条评论
为什么被折叠?



