关联容器

元素按关键字来保存和访问。

map类型通常被称为关联数组。以关键字作为下标。

set就是关键字的简单集合。

multi就是一个关键字可以对应多个值。

map

当对一个map中还没有的关键字对应的元素进行操作时,mao会自动创建一个新元素,其值值初始化。

其内部是通过pair来存储键值对的。

map和set都支持容器操作。

关联容器的迭代器都是双向的。

有序容器的关键字必须是可比较大小的。通过其<运算符。

通过定义比较函数,并将其传入构造关联容器的参数中,即可实现自定义<。

container<type,decltype(function)> name(function);container<type,decltype(function)^*>\ name(function);

pair在头文件utility,默认是值初始化。

关联容器内部定义了三个类型别名。

map的关键字值不能改变,但其值可以改变。

set虽然提供有非常量迭代器,但是其关键字使不能被更改的。

一个有序容器的通过迭代器的遍历时根据关键字升序来遍历的。

关联容器的专用find是极优于泛型的find的。

一般对于关联容器使用泛型算法时,要么将其作为源序列或者以inserter作为目标位置。

insert

insert的返回值是一个pair。第一个元素是指向插入元素的迭代器。第二个元素是bool类型,表示是否插入成功。True表示插入成功。False表示关键字已存在,新的插入失败。

若是multi的,因为不会存在插入失败,因此不存在第二个元素。

erase

map的下标

由于下标可能会插入新元素,而at获取的引用也可能改变值,因此const的map不能使用。

下标运算符的返回是关键字对应的值。而迭代器是一整个pair。

find相当于const的at。

实际上可以将upperbound当做k的尾后指针。

若两个bound返回相同则不存在这个元素,且这这两个bound将返回该元素应该插入的位置。

equal_range(k)返回的是pair<lower_bound(k), upper_bound(k)>。

无序容器

一般哈希能获得更好的平均性能。

当load_factor大于某个值时,会自动rehash。

reserve是保证在未来容器保存n个元素而并不会进行rehash的操作而保证效率。

STL对于很多类型都定义了哈希操作。

但是对于自定义类,需要定义哈希操作与==运算符。

container<type,decltype(hash_f),decltype(=_f)> name(桶大小,f,f)container<type,decltype(hash\_f)^*,decltype(=\_f)^*>\ name(桶大小,f,f)


关联容器
https://lhish.github.io/project/hide/关联容器/
作者
lhy
发布于
2024年6月30日
许可协议