一、同一个类中除了重载,不允许出现同名的方法
比如:类的静态方法和成员函数的名称不能相同,虽然一个是成员函数,另外一个是非成员函数。
标准库的sort算法操作需要随机访问迭代器。
二、STL容器
1 顺序容器
vector/dequeue/list forward_list/array/string
vector
可变大小数组,支持快速随机访问,使用连续内存保存数据。在尾部之外的位置插入或删除元素可能很慢,因为可能需要移动多个元素。插入可能引起内存重新分配,导致迭代器全部失效。删除,删除点之后的迭代器会全部失效。
适用于,变化较少,但是随机分配频繁的场景-
dequeue
双向开口有序序列,支持快速随机访问,使用动态分段连续空间组合而成。中间增删,因为要保证连续性,可能造成前面或者后面所有指针失效,若增加导致map重新配置,会造成指针有效迭代器失效;
image.pngdeque的储存空间主体在缓冲区buffer中,由一段一段的定量连续空间组成。为了便于迭代器的寻址,除了此储存空间,deque采用一个表(map)来记录每个连续空间的首地址。map是一小块连续的空间,每个元素(node)都是指针,指向buffer中的各首地址。
2 关联容器
- list
双向循环链表,不支持随机访问,但是插入和删除的效率很高,增删节点后,只需要修改指针,所有元素的位置都不变,所以迭代器都没有失效。
但是遍历删除的时候需要注意,删除节点的迭代器会失效。
for(auto it = objList.begin(); it != objList.end; it++) {
if(*it == 5) {
objList.erase(it++);
}
}
for(auto it = objList.begin(); it != objList.end; ) {
if(*it == 5) {
it = objList.erase(it++); //前置++返回引用 后置++,返回临时变量
} else {
it ++;
}
}
- set map
所有元素会根据key值自动排序,底层结构是红黑树。因为元素并未连续存放,所以插入删除时原有的迭代器都不会失效。元素位置和key值强相关,key值不能修改,自定义key时,需要重载<。
unordered_set和unordered_map使用哈希map存储,自定义时需要重载==,并提供哈希函数。
3 STL容器适配器: 以现有的容器为底部结构,改变接口
stack 和 queue 并非真实的容器,而是对底层容器封装的适配,默认底层容器是dequeue,stack和queue都不支持遍历,也没有相应的迭代器。
三 函数对象
函数对象,就是一个重载'()'运算符的类的对象。这样就可以直接使用‘对象名()’的方式,这跟调用函数一样,所以称谓函数对象。
(1)函数对象有自己的状态,即它可以携带自己的成员函数,而且这个函数对象在多次调用的过程中它的那些状态是共享的,而函数则不能做到这点(除非定义函数内部的静态变量或者全局变量)。
(2)函数对象有自己的类型,而普通函数则没有。在使用STL的容器时可以将函数对象的类型传递给容器作为参数来实例化相应的模板,从而来定制自己的算法,如排序算法。
