关联容器
元素按关键字来保存和访问。
map类型通常被称为关联数组。以关键字作为下标。
set就是关键字的简单集合。
multi就是一个关键字可以对应多个值。
map
当对一个map中还没有的关键字对应的元素进行操作时,mao会自动创建一个新元素,其值值初始化。
其内部是通过pair来存储键值对的。
map和set都支持容器操作。
关联容器的迭代器都是双向的。
有序容器的关键字必须是可比较大小的。通过其<运算符。
通过定义比较函数,并将其传入构造关联容器的参数中,即可实现自定义<。
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对于很多类型都定义了哈希操作。
但是对于自定义类,需要定义哈希操作与==运算符。