【STL】STL模板库------使用STL

本文介绍了STL容器的分类和共通操作,重点讲解了顺序容器和关联容器。关联容器中,讨论了默认比较方法、无序关联容器的hash处理和用户自定义hash函数的实现要求。此外,还对比了不同容器如vector、deque、list和关联容器的适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、STL容器分类

在这里插入图片描述

二、容器的共通能力和共通操作

  • 所有容器提供value语义而不是reference语义。容器内部进行安插动作实施的是copy或move,而不是管理元素的reference。如果要存放的对象不具有public copy构造函数,或者要做的不是复制,那么就只能使用move操作,要么容器元素就必须是pointer或“用以指向对象”的pointer object。
  • 元素间多次迭代结果相同
  • 不提供错误处理机制

三、顺序容器

在这里插入图片描述

四、关联容器

在这里插入图片描述
在这里插入图片描述

关联容器默认比较方法"<"

如果关联容器存储的key值是用户自定义类,用户需要重载"<"运算符以便容器能够正确的比较出key的大小进而进行数据存取。

无序关联容器的hash方式

由于无序关联容器的实现是基于hash函数,那么就需要解决冲突问题,解决冲突的办法比较常用有开放地址法和拉链法。在C++的unordered_map当中,采用的是”桶(bucket)”的方法,也就是出现冲突的元素都存放在一个桶里。桶内的元素是用链表连接的。

无序关联容器提供用户自定义hash函数

所有hash_table都需要一个hash函数,将放入元素的value映射到某个相关的bucket。

STL中使用用户自定义的hash函数有一定的编写要求:

  • hash函数必须是个函数或者function object,它接受一个元素类型下的value作为参数,返回一个类型为std::size_t的value。bucket的当前数量未被考虑时需要将函数返回值映射到bucket索引范围内。(意思即hash表大小有限,不能超出表大小)
  • 示例:
class Customer{
...
}

class CustomerHash{
public:
	std::size_t operator() (const Customer& c)const{
		return ...
	}
}

五、STL容器比较

默认应该使用vector:

  • vector内部结构最简单
  • vector支持随机访问

deque的使用场景:

  • 经常在序列头尾安插移除元素
  • 希望元素被移除时释放内存用量
  • 希望存储更多的元素(deque相较于vector采用一块内存,多块内存使用可以存更多元素)

list的使用场景:

  • 经常在容器中执行插入、删除和移动

无序关联容器的使用场景:

  • 经常根据某个准则查找元素,应该依据该准则进行hash

有序关联容器使用场景:

  • 经常根据某个准则查找元素且要求依赖元素的次序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值