C++ STL 之 容器
根据侯捷老师的介绍,STL > 我们常说的标准库函数 。STL(Standard Template Library)中还包括了容器(containers),迭代器(iterators),算法(algorithms),分配器(allocators),适配器(adapters),仿函式(functors)。他们之间的关系如下所示:迭代器是算法与容器之间的桥梁。
在C++中,我们包含的头文件中没有.h 如:#include<vector> 。新式头文件内的组件封装在命名空间std当中,一般我们使用 using namespace std;
在新式C语言中,也没有.h了 改为 如:#include<cstdio> 在原先的前面加上一个c,代表是c语言 。但是旧式的#include<stdio.h>也是兼容的
容器可以分为顺序容器和关联容器。顺序容器有 array,vector,list,deque,forward_list。关联容器有set,multiset,map,multimap。map中有关键字和键值,通过访问关键字可以得到对应的键值。set中关键字和键值是同一个。前缀为multi的表示,在插入元素时,可以有重复的键值,而在set和map中,若插入相同的元素,则不会生成新的元素。关联容器的实现方式一般为红黑树。
array的大小在初始化后就固定了,不可以改变,它的内存是连续的;vector.push_back(),可以在它的尾端一直插入元素,当它的空间不足时,它在单前的内存上扩展一倍,如:当前为3,扩展后为6,再扩展为12,24,48;vector.size(),得到是它当前容器中的数据量,而vector.capacity(),得到的是当前容器最大可以放多少元素;deque可以说是双端队列,它在内存中的储存形式是以段的形式进行的,如下图所示
deque它是分段的,每一段内是连续的,段间是间隙的,但是这并不我们使用它的迭代器,因为deque内部会检测,iter.begin(),iter.end();list是可以在两端都进行增加增加新的数据,它在内存中的储存空间不是连在一起的,内存扩展方式为需要一个就寻找一个,将地址连接到空余的地方;forward_list是单端的列表,内存方式也和list是一样的。
注意:iter.begin()是指向容器的第一个元素的地址,iter.end()指向的是最后一个元素的下一个地址,如果使用*(iter.end() )将会超出界限,发生不可预知的错误。