一、容器和迭代器
1.容器的来源:
众所周知,数组有一个弊端,它是固定的,不可变,由于这个限制会导致出现数组越界导常的错误,并且需要事先知道这个数组的长度才可以定义, 但很多时候,我们无法预估所需要的数组参数。
所以我们创造了容器,它是不固定的,可变的,可以根据元素的增加而增加,每次增加原数组的1.5倍,为什么是1.5倍呢?因为2倍太大了,1倍太小,所以为了保证效率,择中选1.5倍。在C++中,容器被定义为:在数据存储上,有一种对象类型,它可以持有其他对象或指向其他对象的指针,这种对象类型就叫做容器。简单理解,即容器就是保存其他对象的对象。而且,这种“对象”还有处理“其他对象”的方法。
容器是随着面向对象语言的诞生而提出的,它甚至被认为是早期面向对象语言的基础。现在几乎所有面向对象语言中都伴随着一个容器,C++中则是标准模版库(STL)。C++采用基于模版的方式处理容器,STL中的容器提供了多种数据结构。
2.容器与数组的区别
数组能存基础数据类型,也可以存引用数据类型;容器只能存引用数据类型数组的长度是固定的,容器的长度可以根据元素的增加而增加
我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。
容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。
▲容器的优点
容器类是一种对特定代码重用问题的良好的解决方案。可自行扩展。当不知道需要存储多少对象时,就不知道应当开辟多大内存空间,而容器不需要预先设定空间长度,只需要创建一个对象并合理调用其提供的方法,其余的细节则由它自身完成,它自己申请内存或释放内存,并使用最优算法执行所有命令。容器类自动申请和释放内存,因此无需进行new和delete操作。
3.容器的分类
序列式容器-排列次序取决于插入时机和位置 关联式容器-排列顺序取决于特定准则
4.为什么会有迭代器?
数组有的功能,容器大部分都会有。数组存放数据可能是有序的,也可能是无序的。所以容器也具备同样的功能,容器英文:Collection,有序的表示为List,即链表结构,无序的表示为Set,即想在哪建立就在哪建立。问题来了,有序的List,我们可以通过索引来遍历数组。但无序的Set怎么办? 用一句话总结:Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而