当前课程知识点:C++语言程序设计进阶 > 第十章 泛型程序设计与C++标准模板库 > 顺序容器 > 顺序容器的基本功能
向量(vector)
双端队列(deque)
列表(list)
单向链表(forward_list) (以上四种在逻辑上可看作是一个长度可扩展的数组)
数组(array)
元素线性排列,可以随时在指定位置插入元素和删除元素。
必须符合Assignable这一概念(即具有公有的拷贝构造函数并可以用“=”赋值)。
array对象的大小固定,forward_list有特殊的添加和删除操作。
构造函数
赋值函数
assign
插入函数
insert, pushfront(只对list和deque), pushback,emplace,emplace_front
删除函数
erase,clear,popfront(只对list和deque) ,popback,emplace_back
首尾元素的直接访问
front,back
改变大小
resize
//10_4.cpp #include <iostream> #include <list> #include <deque> //输出指定的顺序容器的元素 template <class T> void printContainer(const char* msg, const T& s) { cout << msg << ": "; copy(s.begin(), s.end(), ostream_iterator<int>(cout, " ")); cout << endl; } int main() { //从标准输入读入10个整数,将它们分别从s的头部加入 deque<int> s; for (int i = 0; i < 10; i++) { int x; cin >> x; s.push_front(x); } printContainer("deque at first", s); //用s容器的内容的逆序构造列表容器l list<int> l(s.rbegin(), s.rend()); printContainer("list at first", l); //将列表容器l的每相邻两个元素顺序颠倒 list<int>::iterator iter = l.begin(); while (iter != l.end()) { int v = *iter; iter = l.erase(iter); l.insert(++iter, v); } printContainer("list at last", l); //用列表容器l的内容给s赋值,将s输出 s.assign(l.begin(), l.end()); printContainer("deque at last", s); return 0; } /* 运行结果如下: 0 9 8 6 4 3 2 1 5 4 deque at first: 4 5 1 2 3 4 6 8 9 0 list at first: 0 9 8 6 4 3 2 1 5 4 list at last: 9 0 6 8 3 4 1 2 4 5 deque at last: 9 0 6 8 3 4 1 2 4 5 /*
大家好
回来继续学习C++语言程序设计
这一节我们来学习
顺序容器的基本功能
STL中的顺序容器呢
包括向量 双端队列 列表
单向列表和数组
前面四个在逻辑上可以看作
是一个长度可扩展的数组
但是数组容器呢
它的长度是固定的
顺序容器中的元素
是按照线性次序排列的
可以随时在指定的位置插入元素
和删除元素
而()容器必须符合Assignable
这一概念
也就是说
要具有公有的拷贝构造函数
也叫复制构造函数
并且要可以用赋值运算符
这个数组对象呢
也就是Array对象呢
它的大小是固定的
而单链表也就是forward_list
它有具有特殊的添加和删除操作
所以这两个类型呢
是比较特殊的两个类型
接下来呢
我们来看一下顺序容器
有哪些接口
这里列出的接口
不适用于数组类型
和单链表类型
首先呢
顺序容器
它要有构造函数
要有赋值函数 assign
要有插入函数
这个插入函数呢
有多种
有insert push_front
push_back emplace
emplace_front
这些函数我们在后面
有一些例题中都会看到的
还有多种擦除函数
也就是删除函数
另外有两个首尾元素
直接访问函数
访问容器首 访问容器尾
还有改变大小的resize函数
下面我们就通过一个具体的实例
来熟悉一下
顺序容器的几种基本操作
这里首先我们看
我们这个这个printContainer
这个函数模板
它的作用
是输出指定的顺序容器的元素
需要输出元素的这个容器
用参数s传过来
那么输出容器元素之前呢
需要输出一个字符串
作为提示信息
那么这个提示信息
通过第一个参数传进来
所以先将这个字符串内容输出
然后用这个copy函数
将从s.begin
返回的这个迭代器开始
到s.end返回的这个迭代器结束
这个区间的全部元素
都复制到输出流迭代器
指示的位置去
那么这里呢
是用cout构造的输出流迭代器
那么就复制到标准输出设备了
所以用这样的办法
就将容器s里面从开始
到结束的全部元素
都送到标准输出设备去了
我们看现在主函数中
先读入十个整数
然后把它们全部存到
这个双端队列deque容器s里面
每一次用push_front往里面放
也就是将最新读入的元素
放到双端队列的最头的位置
最开头的位置
实际上这个序列
是一个反向生成的序列
也就是最后读入的元素
在最开头位置
现在我们用
printContaine输出验证一下
输出这个s的内容
我们看到读入的内容是
0 9 8 6 4 3 2 1 5 4
那么输出的内容呢
正好是反过来的次序
因为这个序列是反向生成的
接下来呢
我们再用s容器里面的内容
去构造
去初始化一个新的list对象
一个列表容器对象
那用的时候呢
注意这里面给的两个迭代器
指示它的起始位置和结束位置
都是逆向迭代器
s.rbegin指的实际上是
这个s里面元素的最后一个
s.rend指的是s这个容器的
最开端的位置
所以实际上是一个逆向的
从后往前取数据
这样取完全部s里面的元素
用来构造list对象
构造完这个list对象以后
我们把这个对象
容器对象l我们再输出一下
看一下这个效果
list里面的内容呢是正向的
那么它正好是跟双端队列
deque里面的内容
是反过来的
因为是用逆序的方法构造的
接下来再将列表容器
l里面的每两个相邻的元素呢
顺序进行颠倒
这个事情怎么做的呢
我们首先用l.begin返回指向
容器元素开始位置的迭代器
放在iter里面
我们用iter来遍历整个容器
这个while循环控制
当iter还不等于l.end
返回的迭代器的时候呢
就说明还没有达到表尾
这个时候我们就继续执行循环体
每一轮循环
将iter当前指向的这个元素
暂时存到v里面
然后擦除这个元素
也就是删除它
从列表里面删除它
删除完了以后呢
iter++ 首先++在这里面
指向下一个元素
然后将v插到下一个位置去
这样不就是
相邻元素交换了一下吗
一直这样循环
直到处理完全部的
这个容器里面的元素
然后调用printContainer
输出验证一下
我们看到这个时候
输出的这个list里面的元素
就跟刚才的相比
它都是两两交换了的
最后呢
我们再用列表容器
l里面的全部内容给s赋值
调用s.assign
那需要赋过去的值是什么呢
是从l.begin开始
到l.end结束之间
这个区间内的全部元素
用来赋值给s
经过这样赋值以后呢
s里面的内容
和这个l里面的内容就一样了
最后我们输出这个s
调用printContaine
输出s 验证一下
确实这两个列表里面的元素
这个s和list里面的元素
就一样了
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义