容器库(11)-std::unordered_map

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

返回容器的元素个数。代码示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucy_stone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值