【C++ Primer读书笔记】第11章 关联容器

本文详细介绍了C++中的关联容器,包括自定义比较函数、添加和删除元素的操作,以及下标访问和元素查找。同时,讨论了无序容器的使用,如unordered_map和unordered_set,强调它们与有序容器的区别,并展示了如何管理哈希桶。此外,还提到了自定义类类型在无序容器中的要求,需要重载hash函数和相等运算符。
摘要由CSDN通过智能技术生成

关联容器概述

关键字类型的要求

自定义关键字类型的比较函数:必须满足严格弱序

bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
{
    return lhs.isbn() < rhs.isbn();
}
// decltype获取函数指针类型
multiset<Sales_data, decltype(compareIsbn)*> bookstore(compareIsbn);

关联容器操作

添加元素

word_count.insert({word, 1});
word_count.insert(make_pair(word, 1));
word_count.insert(pair<string, size_t>(word, 1));
word_count.insert(map<string, size_t>::value_type(word,1));

insert操作返回一个pair,first成员是一个指向该元素的迭代器,second成员是一个bool值,表示是否插入成功,如果关键字已在容器中为false,否则为true。

multimap的insert操作只返回一个指向新元素的迭代器。

删除元素

c.erase(k)  // 从c中删除所有关键字为k的元素,返回删除元素的数量
c.erase(p)  // 从c中删除迭代器p指向的元素,返回指向p之后的元素的迭代器
c.erase(b, e)   // 删除迭代对b和e所表示的范围中的元素,返回e

下标操作

c[k]    // 返回关键字为k的元素,如不存在则添加一个关键字为k的元素,对其进行值初始化
c.at(k) // 访问关键字为k的元素,如不存在则返回out_of_range异常

访问元素

c.find(k)   // 返回一个迭代器,指向第一个关键字为k的元素
c.count(k)  // 返回关键字等于k的元素数量
c.lower_bound(k)    // 返回一个迭代器,指向第一个关键字不小于k的元素(无序容器不适用)
c.upper_bound(k)    // 大于k
c.equal_range(k)    // 返回一个迭代器pair,表示关键字等于k的元素的范围

无序容器

使用无序容器

unordered_map、unordered_set、unordered_multi_map、unordered_multi_set

有序关联容器使用比较运算符组织元素,而无序关联容器使用哈希函数和关键字类型的==运算符

管理桶

具有相同哈希值的所有元素保存在同一个桶中

c.bucket_count()    // 正在使用的桶的数目
c.max_bucket_count()    // 容器能容纳的最多的桶的数量
c.bucket_size(n)    // 第n个桶中的元素数量
c.bucket(k)     // 关键字为k的元素在哪个桶中

local_iterator  // 可以用来访问桶中元素的迭代器类型
c.begin(n), c.end(n)    // 桶n的首尾元素迭代器

c.load_factor()     // 每个桶的平均元素数量,float值
c.max_load_factor()     // c试图维护的平均桶大小
c.rehash(n)     // 重组存储,使得bucket_count >= n 且 bucket_size > size/max_load_factor
c.reserve(n)    // 重组存储,使得c可以保存n个元素且不必rehash

定义关键字类型为自定义类类型的无序容器,需要重载hash函数和==运算符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值