11.3 顺序容器类

来源:互联网 发布:sql server身份验证sa 编辑:程序博客网 时间:2024/06/18 05:35
顺序容器:包括矢量(vector)、列表(list)和双端队列(deque)。vector类和deque类是以数组为基础的,list类是以双向链表为基础的。

矢量类

◆ 1、矢量类的概念:矢量(vector)类提供具有连续内存地址的数据结构,可通过下标运算符[ ]直接有效地访问矢量的任何元素。

与数组不同,vector的内存用尽时,vector自动分配更大的连续内存区,将原先的元素复制到新的内存区,并释放旧的内存区。这是矢量类的优点。

内存分配由分配子(Allocator)完成。分配子也是类,它运用了new和delete运算符,本教材不作进一步讨论。

◆ 2、矢量类的迭代子:每个容器都有自己所支持的迭代子类型,迭代子决定了可采用哪种算法。vector支持随机访问迭代子,具有最强的功能。vector的迭代子通常实现为vector元素的指针。所谓选择容器类,实际上很大部分是选择所支持的迭代子。

◆ 3、矢量容器的声明例
#include<vector>
……
vector<int> vi;
//定义存放整形序列的向量容器对象vi,长度为0的空vector
vector<float> vf; //存放实型序列的向量容器
vector<char> vch; //存放字符序列的向量容器
vector<char*>vstr; //存放字符串序列的向量容器

◆ 4、矢量容器的构造函数
     vector(size_t n);
    //构造一个有n个元素的矢量,每个元素都是由默认的构造函数所建立的
    vector(size_t n,T& V);
    //T表示矢量的基本类型,如int;为每个元素用同一个对象V来赋初值
    vector(first,last);
    //元素的初值由区间[first,last)指定的序列中的元素复制而来
    vector(vector<T>& X)
    //复制构造函数
这些构造函数还可以显式给出分配子(allocator)对象。

◆ 5、对矢量的操作包含了第六章在顺序表中所列出的操作,甚至更丰富。每种操作都是成员函数。对用户自定义的元素类,要重载“= =”和“<”等比较运算符。

【例11.2】寻找vector容器元素。(查看源码

◆ 6、特殊类型迭代子:*它们本身也具有五种四级迭代子属性之一。

反转型迭代子(Reverse Iterator):它是把一切都颠倒过来。正向遍历一个第一类容器时,如果用了反转迭代子,实际上实现的是反向遍历。

插入型迭代子(Insertion Iterator):当用普通输出迭代子来产生一个元素序列时,一旦添加一些元素就得完全重写。例如普通输出迭代子可以把一个矢量a的内容复制到另一个矢量b中,复制可以从矢量b任一元素开始,矢量b对应位置上的元素被覆盖,相当于改写。插入迭代子则可以添加元素,复制时它可以把矢量a插入到矢量b任一位置。同一个copy()算法用不同类型迭代子,结果是不同的。

流迭代子(Stream Iterator):包括输入流迭代子(Istream_Iterator)和输出流迭代子(Ostream_Iterator)

【例11.3】用istream_iterator从标准输入读入一个整数集到vector中。(查看源码

列表类

列表类是由双向链表组成的。它有两个指针域,可以向前也可以向后进行访问,但不能随机访问,即支持的迭代子类型为双向迭代子。列表类不能使用下标运算符[]。它定义在头文件<list>中。

列表类容器也有多种构造函数,与矢量类形式相同。

【例11.4】展示列表类怎样进行链表操作。(查看源码
在本例中建立了两个已排序好的列表类对象,然后归并。全部用列表类的成员函数。不能使用泛型算法sort()对无序的列表类对象排序,因为sort()要求随机迭代子,list仅支持双向迭代子。

双端队列类

双端队列允许在队列的两端进行操作。它以顺序表为基础,所以能利用下标提供有效的索引访问,它支持随机访问迭代子。使用双端队列,必须包含头文件<deque>。

双端队列类容器也有多种构造函数,与矢量类或列表类形式相同。

【例11.5】双端队列类与矢量类一样,有一个成员函数insert(),注意不是插入迭代子适配器函数insert()。本例演示该函数的使用,最后输出字符串:“STL功能强使用方便。”(查看源码

deque类重载了多个成员函数insert():
    insert (it,x);
    //在迭代子it指定元素前插入一个值为x的元素,返回指向新元素的迭代子
    insert (it,n,x);
    //在迭代子it指定元素前插入n个值为x的元素
    insert (it,first,last);
    //在迭代子it指定元素前插入由区间[first,last)指定的序列
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 嘴唇上有白点颗粒状怎么办 嘴唇缺了一块红怎么办 人得钩端螺旋体怎么办 脖子上有鸡皮肤怎么办 不结婚老了以后怎么办 丁克族老了怎么办知乎 2个月宝宝咳嗽怎么办 干活累的手疼怎么办 脸上长白色的癣怎么办 全身起红斑很痒怎么办 宝宝脖子红烂了怎么办 背上长红斑很痒怎么办 身上起风疙瘩很痒怎么办 身上起小包很痒怎么办 浑身起红包很痒怎么办 手太粗糙怎么办小窍门 小腿长疙瘩很痒怎么办 腿过敏起红疙瘩怎么办 肚子上起红疙瘩很痒怎么办 小蚂蚁咬了肿了怎么办 锦鲤鱼尾巴烂了怎么办 泰迪身上长白毛怎么办 鱼身上有红斑了怎么办 新买锦鲤不吃食怎么办 鱼身上有红血丝怎么办 大腿内侧有红色条纹怎么办 腿上出现红血丝怎么办 孕妇有脚气,很痒怎么办 孕晚期脚气很痒怎么办 孕期有脚气很痒怎么办 激光后留下色沉怎么办 腋下很黑怎么办怎样才能变白 屁股上长一块癣怎么办 鼻两侧一热发红怎么办 脸上起皮发红痒怎么办 自癜风发红发痒怎么办 脸又干又痒怎么办 脸发红还有点痛怎么办 脸过敏了红痒怎么办 脸两边一片红痒怎么办 婴儿大腿内侧破皮怎么办