STL视频_02
【01:05】主要讲一下几个要点:
1、模板。函数模板 类模板 以及它们的用法
2、容器。什么是容器 和 容器的分类,各种容器的数据结构
3、容器vector的具体用法,包括迭代器的具体用法
【01:40】模板
模板是实现代码重用机制的一种工具,实质就是实现类型参数化,即把类型定义为参数。
C++提供两种模板:函数模板,类模板。
【02:40】例子
【04:13】函数模板 的写法
ZC:template <typename/calss T>
【05:35】如何调用 模板函数
ZC:返回值 = 函数名<类型>(输入参数1, 输入参数2, 输入参数3, ... ...);
【06:41】函数名max 有问题,∵STL里面已经存在 名为max的函数了
【07:02】ZC:函数名后面不需要“<类型>”...
ZC:返回值 = 函数名(输入参数1, 输入参数2, ... ...);
【08:55】求一个最大值的类(类模板)
先是普通的类
【11:23】开始 类模板
ZC:template <typename/calss T>
【12:08】如何调用类模板
ZC:类名<类型> 实例(构造参数);
【14:06】编译的时候,会把虚拟类型全部用实际的类型替代掉
【14:23】指定多种类型的类模板
“
可以定义多种类型的形参。
template<typename T1, typename T2>
class CTest
{...};
对象实例化时:
CTest testA<int, float>;
CTest testB<double, string>
”
【14:47】开始讲容器
容器的简介、分类、各种容器的数据结构
【15:05】容器是用来存放、管理一组元素的数据集合。
【15:58】
“
容器有序列式容器(Sequence containers)和关联式容器(Associated containers)
序列式容器:每个元素的位置取决于元素被插入的时机,被插入时设置的位置,和元素值本身无关。
序列式容器有vector、deque、list
关联式容器:元素位置取决于特定的排序准则,和插入顺序无关。
关联式容器有set、multiset、map、multimap
”
【17:00】先讲vector容器,它最简单,vector容器的具体用法 以及 迭代器的具体用法
“
vector的简介
vector使用之前的准备
vector对象的默认构造
vector末尾的添加移除操作
vector的数据存取
迭代器的简介
双向迭代器与随机访问迭代器
vector与迭代器的配合使用
vector对象的带参数构造
vector的赋值
vector的大小
vector的插入
vector的删除
”
【23:17】例子
【24:20】打印vector里面的所有元素
ZC:for 使用的是 size_t
【27:03】修改 vector里面的元素的值
【28:23】返回第一个元素(vector<类型>::front()),最后一个元素(vector<类型>::back())
【28:23】修改第一个元素(vector<类型>::front() = ?;),最后一个元素(vector<类型>::back() = ?;)
【30:10】介绍迭代器
“
迭代器是一个“可遍历STL容器内全部或部分元素”的对象。
迭代器指出容器中的一个特定位置。
迭代器就如同一个指针。
迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中对象的范围。
”
“
这里大概介绍一下迭代器的类别。
输入迭代器:也有叫法称之为“只读迭代器”,它从容器中读取元素,只能一次读入一个元素向前移动,只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列。
输出迭代器:也有叫法称之为“只写迭代器”,它往容器中写入元素,只能一次写入一个元素向前移动,只支持一遍算法,同一个输出迭代器不能两遍遍历一个序列。
正向迭代器:组合输入迭代器和输出迭代器的功能,还可以多次解析一个迭代器指定的位置,可以对一个值进行多次读/写。
双向迭代器:组合正向迭代器的功能,还可以通过--操作符向后移动位置。
随机访问迭代器:组合双向迭代器的功能,还可以向前向后跳过任意个位置,可以直接访问容器中任何位置的元素。
目前本系列教程所用到的容器,都支持双向迭代器或随机访问迭代器,下面将会详细介绍这两个类别的迭代器。
”
【34:06】
输入迭代器 和 输出迭代器 是最基本的/最原始类型的 迭代器。
正向迭代器 是对 输入迭代器 和 输出迭代器 的组合。
双向迭代器 是对 正向迭代器 再加上 逆向操作(向后移动的功能) 的组合
随机访问迭代器 它其实就是组合了 正向迭代器的功能 还可以向前向后跳过任意一个位置(可以直接访问容器中任何位置的元素)
【35:35】
“
双向迭代器支持的操作:
it++, ++it, it--, --it,*it, itA = itB,
itA == itB,itA != itB
其中 list, set, multiset, map, multimap支持双向迭代器。
随机访问迭代器支持的操作:
在双向迭代器的操作基础上添加
it+=i, it-=i, it+i(或it=it+i),it[i],
itA<itB, itA<=itB, itA>itB, itA>=itB 的功能。
其中 vector,deque 支持随机访问迭代器。
”
【39:00】vector 和 迭代器 是如何配合使用的
“
vec.begin(); //返回容器中第一个元素的迭代器。
vec.end(); //返回容器中最后一个元素之后的迭代器。
例如:vecInt是用vector<int>声明的容器,假设已经包含了按顺序的1,3,5,7,9元素。
vector<int>::iterator it; //声明容器vector<int>的迭代器。
运行 it=vecInt.begin(); //此时*it==1。
运行++it; // 或者it++; 此时*it==3,前++的效率比后++的效率高,前++返回引用,后++返回值。
运行it += 2; //此时*it==7。
运行it = it +1; //此时*it=9。
运行++it; //此时it==vecInt.end(); 此时不能再执行*it;
”
【40:50】vector<类型>::iterator it = vector实例.begin();
【42:25】iterator往后移一下后又往前移一下
【42:49】 注意点:“运行++it; // 或者it++; 此时*it==3,前++的效率比后++的效率高,前++返回引用,后++返回值。”
返回值的速度就比较慢
【43:12】随机访问,跳了两个位置
【44:45】之前是通过“for (size_t i=0; i<vectA.size(); i++){ vectA[i] }”来遍历的
现在通过迭代器来遍历
“
vector<int>::iterator it = rectA.begin();
for (it; it != rectA.end(); ++it)
{
cout << *it;
}
”
【47:07】反向迭代器
“
vector<int>::reverse_iterator it = rectA.rbegin();
for (it; it != rectA.rend(); ++it)
{
cout << *it;
}
”
这里也是 ++it,并非 --it !!
【48:27】看图解释 反向迭代器
【49:18】
“
迭代器还有其它两种声明方法:
如:
vector<int>::const_iterator
vector<int>::const_reverse_iterator
这两种分别是
vector<int>::iterator
vector<int>::reverse_iterator
的只读形式,使用这两种迭代器时,不会修改到容器中的值。
备注:不过容器中的insert和erase方法仅接受这四种类型中的iterator,其它三种不支持。《Effective STL》建议我们尽量使用iterator取代const_iterator、reverse_iterator和const_reverse_iterator。
”
【50:23】vector对象的带参数构造
“
vector(beg, end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
vector(n, elem); //构造函数将n个elem拷贝给本身。
vector(const vector &vec); //拷贝构造函数。
”
【51:50】“vector(beg, end);”的例子
【52:50】
“
int iArray[] = {0,1,2,3,4};
vector<int> vecIntA( iArray, iArray+5 );
”
ZC:这里把 数组名(就是指针)也当做 iterator 来用了。(这里也照应了本节课程之前讲过的 iterator类似于指针)
ZC:这里的这种情况,应该这样理解吧:指针可以当做iterator使用,但是iterator不能当做指针使用(注意这里的指针是数组指针,它指向的是连续的地址空间)。
【53:35】“vector(n, elem);”的例子
【55:05】vector 的赋值
“
vector.assign(beg,end); //将 [beg, end)区间 中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
vector.assign(n,elem); //将n个elem拷贝赋值给本身。
vector& operator=(const vector &vec); //重载等号操作符
vector.swap(vec); // 将vec与本身的元素互换。
”
【56:05】vector的大小
“
vector.size(); //返回容器中元素的个数
vector.empty(); //判断容器是否为空
vector.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
vector.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
例如 vecInt是vector<int> 声明的容器,现已包含1,2,3元素。
执行vecInt.resize(5); //此时里面包含1,2,3,0,0元素。
再执行vecInt.resize(8,3); //此时里面包含1,2,3,0,0,3,3,3元素。
再执行vecInt.resize(2); //此时里面包含1,2元素。
”
【57:45】vector的插入
“
vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
vector.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
”
【58:49】vector的插入 的例子
【01:00:25】vector的删除
“
vector.clear(); //移除容器的所有数据
vec.erase(beg,end); //删除 [beg,end)区间 的数据,返回下一个数据的位置。
vec.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
”
ZC:注意这里和上面的区间,都是 前闭后开 的。
【01:00:45】vector的删除,如果元素是类实例的话,会帮你释放掉;如果是类实例的指针的话,不会帮你delete 。
【01:01:40】vector的删除 例子
【01:02:16】vector的删除 另一个例子
删除 值相等的元素,这个例子比较重要
【01:05:33】分析一下这个循环
【01:06:00】此时,不执行 ++it;
【01:06:40】回顾本讲内容
C
STL视频_02的更多相关文章
- STL视频_01
ZC:这里视频里面有一个调试小技巧,VS08/VS2010开始,控制台程序会自动退出(不像VC6),那么可以在 函数退出的最后一句语句上设置断点,然后查看控制台打印出来的信息.ZC:这一讲,给我的感觉 ...
- STL视频_00
[05:40]比赛规则 - Part01[06:33]比赛规则 - Part02[07:28]比赛规则 - Part03[08:45]提出的问题 - 1和2[09:23]提出的问题 - 3和4 *** ...
- C语言 C++1X STL QT免费视频课程 QT5界面开发美化 式样表 QML
C/C++/QT界面开发界面美化视频课程系列 课程1 C语言 C++1X STL QT免费视频课程 QT5界面开发美化 式样表 QML 返回顶部 课程1 C语言 C++1X STL QT免费视 ...
- QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL
QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1 C语言程序设计高级实用速成课程 基础+进阶+自学 课程2 C语言程序设计Windows GDI图形绘 ...
- 我的STL学习之路
说起STL(标准模板库),相信了解C++的都不会陌生吧^_^.LZ是从大三开始学习C++(ps:不是科班出身),并慢慢接触使用STL的,在学校中使用STL比较多的情况是写数据结构代码,使用STL实现数 ...
- STL学习之路
本文面向的读者:学习过C++程序设计语言(也就是说学习过Template),但是还没有接触过STL的STL的初学者.这实际上是我学习STL的一篇笔记,老鸟就不用看了. 什么是泛型程序设计 我们可以简单 ...
- 侯捷STL学习(一)
开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 ...
- 软件开发:网站&视频&书籍推荐(不断更新)
利用书籍进行系统学习,凭借博客/新闻等资料开阔眼界,辅之以代码及项目实战,并勤加以总结,方可进步. 常用网站: Leetcode刷题:https://leetcode.com/ ,练习数据结构和算法必 ...
- 软件开发:网站&视频&书籍&文章推荐(不断更新)
利用书籍进行系统学习,凭借博客/新闻等资料开阔眼界,辅之以代码及项目实战,并勤加以总结,方可进步. 常用网站: 找英文电子书网站:gen.lib.rus.ec 和 www.jiumodiary.com ...
随机推荐
- iOS 关于自定义UICollectionViewLayout实现复杂布局
UICollectionView的简单介绍 UICollectionView的结构 Cells Supplementary Views 追加视图 (类似Header或者Footer) Decorati ...
- Linux运维-zabbix_agent最新版的yum安装
agentd端可以直接使用yum来进行安装 rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1. ...
- Apache JServ Protocol (AJP)
The Apache JServ Protocol (AJP) is a binary protocol that can proxy inbound requests from a web serv ...
- locust参数化
前面用篇专门讲了requests实现接口的参数关联案例,这里直接转化成locust脚本就行了 # coding:utf-8 from locust import HttpLocust, TaskSet ...
- 提交cookie登录
# coding:utf-8import requests # 先打开登录首页,获取部分cookieurl = "https://passport.cnblogs.com/user/sign ...
- 如何用云存储和CDN加速网站图片视频、阿里云OSS的使用(转)
总有人说阿里云主机带宽小,那只是因为你还停留在单机架构上. 阿里的架构设计,云主机主要用来跑程序的,附件的存储和访问主要靠OSS. 有人又会说了,OSS按存储费+流量双重计费伤不起,只是你不知道OSS ...
- Android测试读写sd卡文件与写sd卡文件耗时
测试从sd卡读1k大小的文件,再写1k大小的文件,由于处理耗时很短,所以循环500次,查看耗时:测试写1k大小的文件,直接在内存构造一个1k的buffer,将这个buffer直接写到文件,同样循环50 ...
- java ReentrantLock可重入锁的使用场景
摘要 从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些. 场景1:如果发现该操作已经在执行中则不再执行(有状态执行) a.用在定时任务时,如果任务执行时间可能超过下次 ...
- 【整理学习Hadoop】H D F S 一个分布式文件系统
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时,它和其他的分布式文件系统的区别 ...
- 谷歌机器学习速成课程---3降低损失 (Reducing Loss):学习速率
正如之前所述,梯度矢量具有方向和大小.梯度下降法算法用梯度乘以一个称为学习速率(有时也称为步长)的标量,以确定下一个点的位置.例如,如果梯度大小为 2.5,学习速率为 0.01,则梯度下降法算法会选择 ...