没有合适的资源?快使用搜索试试~ 我知道了~
内容概要:这篇PDF文档详细介绍了STL(Standard Template Library)的组成部分,包括容器、迭代器和算法,涵盖了STL的各种操作细节,如容器元素的要求、错误与异常的处理、各种容器的特性以及迭代器的应用等。 适合人群:熟悉C++基础语法,有一定编程经验和面向对象思想的学习者。 使用场景及目标:①深入理解STL的工作机制以便在项目实践中高效地应用;②掌握常见的容器类型,如vector、deque、list等以及适当时刻选择合适的数据结构;③学会利用迭代器遍历容器并执行相应操作,从而提升程序开发的质量和编码效率。 阅读建议:学习过程中应结合大量实验练习更好地巩固STL的基础理论知识,同时对于迭代器和算法的实际案例加深理解是非常重要的一步。
资源推荐
资源详情
资源评论
《STL学习笔记》系列分享专栏
简介
内容是关于学习和使用STL的点点滴滴
文章
STL学习笔记----1.概述
STL学习笔记----2.容器的共通操作
STL学习笔记----3.容器 vector 和 deque
STL学习笔记----4.容器 list
STL学习笔记----5.容器 set 和 multiset
STL学习笔记----6.容器 map 和 multimap
STL学习笔记----7.STL迭代器
STL学习笔记----8.STL仿函数
STL学习笔记----9.STL算法之 for_each()
STL学习笔记----10.STL算法之 (非变动性算法)
STL学习笔记----11.STL算法之 (变动性算法)
STL学习笔记----12.STL算法之 (移除性算法)
STL学习笔记----13.STL算法之 (变序性算法)
STL学习笔记----14.STL算法之 (排序算法)
STL学习笔记----15.STL算法之 (已序区间算法)
STL学习笔记----16.STL算法之 (数值算法)
STL学习笔记----1.概述
本系列是我学习 STL 的一些笔记,都是一些我工作中常用的主题。其中主要参考《C++标准程序库》这本书和一些网络上的博客。
一.一.STL 组件组件
1. 容器容器(Containers):用来管理某类对象的集合。
2. 迭代器迭代器(Iterators):用来在一个对象群集的元素上进行遍历动件。迭代器的接口和一般指针差不多,以operator++累加,以operator* 提取所指的值。
3. 算法算法(Algorithms):用来处理群集内的元素。
STL 的基本观念就是将数据与操作分离。
数据由容器类加以管理,操作由算法定义,迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作,如下图:
二.容器二.容器
容器可以分为两类:
1. 序列式容器:序列式容器:vector,, deque,, list
2. 关联式容器:关联式容器:set,, multiset,, map,, multimap
3. 容器配接器:容器配接器:stacks,,queues,, priority queues,, string
这是一些特别的容器,它们是根据基本容器类别实现来的。
三.迭代器三.迭代器
迭代器是一个“可以遍历 STL 容器内全部或部分元素”的对象。一个迭代器用来指出容器中的一个特定位置。
事实上每一种容器类型都有自己的迭代器,但它们对外的接口是相同的,这就是一种泛型程序设计。
1. 迭代器的基本操作迭代器的基本操作
(1). Operator*
(2). Operator++
(3). Operator== 和 operator!=
(4). Operator=
2. 获取迭代器获取迭代器
所有容器都提供一些成员函数使我们获得迭代器,最重要的是:
(1). begin() 返回一个迭代器,指向容器的起点,也就是第一个元素的位置。
(2). end() 返回一个迭代器,指向容器结束点,也就是最后一个元素之后的位置。
(1). rbegin() 返回一个迭代器,指向容器最后一个元素的位置。
(2). rend() 返回一个迭代器,指向容器第一个元素之前的位置。
注意:begin() 和 end() 形成了一个半开区间,如下图:
3. 迭代器的类型迭代器的类型
任何容器都提供两种迭代器类形,读写模式和只读模式
(1). Container::iterator 读/写模式遍历元素。
(2).Container::const_iterator 只读模式遍历元素。
4. 迭代器的分类迭代器的分类
(1). 双向迭代器双向迭代器
双向迭代器,可以以递增++运算前进或以递减--运算后退。
list,set,multiset,map,multimap 这些容器所提供的迭代器都属于此类。
(2). 随机存取迭代器随机存取迭代器
随机存取不但具备双向迭代器的所有属性,还具备随机访问能力。
也就是它提供了“迭代器算法运算”必要的操作符,如:+n,-n,>,< 等。
vector,deque,string 这些容器的迭代器属于此类。
注意:注意:
list<char>::iterator pos;
for (pos = coll.begin(); pos != coll.end(); ++pos) {
*pos = toupper(*pos);
}
for (pos = coll.begin(); pos != coll.end(); pos++) {
^^^^^ // OK, but slower
...
}
++pos 要比 pos++ 效率高,因为后者需要一个额外的临时对象来存放迭代器的原来位置并将它返回,所以一般情况下最好用 ++pos。
四.算法四.算法
算法并非容器类形的成员函数,而是搭配迭代器使用全局函数。
这里体现的是泛型函数式编程思维模式,而不是OOP 模式,因为在OOP 概念里,数据和操作是一体的。
注意:注意:
1. 所有的算法都用来处理一个或多个区间内的元素,所以我们必须将区间首尾当做两个参数传给算法。调用者必须保证这个区间的有效性。
2. 所有算法处理的都是半开区间 [begin, end )。
3. 在处理多个区间时,要保证第二个区间能够容纳第一个区间的所有元素。
五五. 迭代器配接器迭代器配接器
迭代器配接器,也就是一类特殊的迭代器。主要有以下三种:
1. 安插型迭代器 (Insert iterators)
2. 流迭代器 (Stream iterators)
3. 逆向迭代器 (Reverse iterators)
六六. 容器内的元素容器内的元素
容器元素的条件:容器元素的条件:
STL 容器内的元素必须满足下面三个基本要求:
1. 必须是可以用拷贝构造函数进行复制的。
2. 必须是可以用 =操作符完成赋值操作的。
3. 必须是可以用析构函数完成销毁操作的。
Value 与与 Reference
所有容器都会建立元素副本,并返回该副本。这意味着 STL 只提供 Value 语意。
STL 只支持 Value 语意,不支持 Reference 语意。如果你想要支持 Reference 语意,你可以用指针作为元素来实现,但是要非常谨慎。
七七. 错误与异常错误与异常
1. 错误处理错误处理
STL 的设计原则是效率优先,安全次之。而错误检查相当花时间,所以在 STL 里几乎没有错误处理。
所以对操作人员来说,要自己保证使用 STL 的正确性,或者自己增加一层包装来实现STL的安全性。
2. 异常处理异常处理
(1). 所有以节点实现的容器,如 list, set, multiset, mpa, multimap,如果节点构造失败,容器保持不变。
(2). 移除(removing)节点的动作保证不会失败。
(3). 对关联式容器插入(insert)多个元素,如果失败,则无法完全恢复原状。
(4). 对关联式容器插入单一个元素,要么成功,要么没有任何影响。
(5). 所有擦除(erase)操作,无论是针对单一元素或针对多重元素,肯定会成功。
(6). vector,deques类型的容器,在安插(insert)元素时如果失败,都不可能做到完全回复。
STL学习笔记----2.容器的共通操作
每个容器都有很多操作,以下操作为所有容器共有的::
一.构造,拷贝和析构一.构造,拷贝和析构
ContType <Elem> c 创建一个空容器,其中没有任何元素
ContType <Elem> c1(c2) 创建一个同种类形容器的一个copy
ContType <Elem> c(beg,end) 创建一个容器,以区间[beg,end)做为元素初值
c.~ContType <Elem>() 销毁所有元素,并释放内存
二.与大小相关的操作二.与大小相关的操作
c.size() 返回当前的元素数量
c.empty() 返回 bool 型,判断容量是否为0。 等同与 size()==0, 但可能更快
c.max_size() 返回可容纳元素的最大数量,很大一个数
例子:
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> col(10);
cout << col.size() << endl; //10
if (col.empty()) //bool 型
{
cout << "empty"<<endl;
}
cout<<col.max_size()<<endl; //很大一个数
return 0;
}
三.比较操作三.比较操作
c1 == c2 判断 c1 是否等于 c2
c1 != c2 判断 c1 是否不等于 c2
c1 < c2 判断 c1 是否小于 c2
c1 > c2 判断 c1 是否大于 c2
c1 <= c2 判断 c1 是否小于等于 c2
c1 >= c2 判断 c1 是否大于等于 c2
四.赋值操作四.赋值操作
c1 = c2 将c2的全部元素赋值给c1,c1与c2必须是同种类型
五.交换操作五.交换操作
c1.swap(c2) 将c1和c2元素互换
swap(c1,c2) 同上,是个全局函数
六.迭代器相关六.迭代器相关
c.begin() 返回一个随机存取迭代器,指向第一个元素
c.end() 返回一个随机存取迭代器,指向最后元素的下一个下一个位置
c.rbegin() 返回一个逆向迭代器,指向逆向迭代的第一元素,也就是最后一个元素
剩余35页未读,继续阅读
资源评论
天涯学馆
- 粉丝: 1950
- 资源: 312
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Rust的区间和查询问题解决与实现
- YOLOv10在机器人导航中的应用及其代码实现
- 基于上层大气数值模型的X射线传输特性研究数据集.zip
- 递增子序列求和算法的PHP实现
- hbuilderhbuilderhbuilderhbuilder
- NSF资助合成生物学项目数据.zip
- Palindromic Substrings(C#).md
- 物联网开发1个光控开关,利用arduino开发板、光敏电阻,自制一个led天黑自动开灯,天亮自动关灯
- 编译好的OnnxRuntime-win-x64-1.19.0库
- winform开发+正运动函数封装库+自定义开关ToggleButton按钮,适用于自动化行业中输出按键的控制,用户看的更加直观
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功