《C++ STL基础 及应用》笔记

第三章 迭代器
·迭代器是STL重要的核心技术,提供了统一访问容器元素的方法,为编制通用算法提供了坚实的技术基础。
·迭代器即是指针,可以是所需要的任意类型,它的最大好处是可以使容器和算法分离开来。
(个人理解是,迭代器就是对指针的泛型处理,处理方式为运算符重载)
·(1)输入迭代器:能进行构造和默认构造,能被复制或赋值,能进行相等性比较,能进行逐步向前移动,能进行读取值。
  (2)输出迭代器:相对输入迭代器,能进行写入值(*p=x,但不能读出)。
  (3)前向迭代器:以上两者功能的结合
  (4)双向迭代器:前向迭代器的所有功能+自减操作
  (5)随机迭代器:双向迭代器的所有功能+一个指针所有的功能([]随机访问)




第五章 字符串
·在STL中,实现基本数据类型与字符串的相互转化,用流类如stringstream做中间媒介是一个很好的思路。


第六章 函数对象
·函数对象的关键思想是,在函数中调用所需类对象的函数,使程序结构同时显得非常简洁。
(个人理解是,函数对象就是用对象来执行函数的功能,类的内部通常会重载“()”运算符)
·单独使用函数对象实现相应功能优势是不大的,必须与STL算法结合才能体现出它的好处来。
·函数适配器,bind2nd相当于将一个二元函数降低为一元函数,给函数的第二个参数绑定一个值。而not1和not2则是相当于将函数返回值取反。
ptr_fun()则是把普通函数封装成函数对象,以便作为bind2nd的参数。mem_fun是调用类中的成员函数,在多态应用程序中会经常用到。


第七章 通用容器
·有效空间通常比总空间少1,类似C风格字符串。
·顺序容器vector,增加新元素时,如果超过当前的容量,则容量会自动扩充2倍,如果两倍容量仍不够,就扩大至足够大的容量。
·对vector容器而言,当增加新元素时,有可能很快(直接存在预留空间中),有可能稍慢(扩容后再存);对修改元素值而言是较快的;对删除元素来说,若删除尾部元素较快,非尾部元素则稍慢,因为涉及到删除后的元素移动。
·deque双端队列容器,相对于vector的优势是:deque支持高效插入和删除容器的头部元素。并且该容器扩容时,原有空间并不会释放,而是在此基础上增加新空间。
·使用sort函数排序前,要清楚,如果容器内元素不是基本类型,那么需要对<和==进行重载才可以调用sort函数。
·优先队列,程序员可以通过template参数指定一个排序准则。缺省的排序准则是利用operator< 形成降序排列,那么所谓“下一个元素”就是“数值最大的元素。


第八章 非变异算法
·非变异算法不直接改变其操作的数据结构的元素。如:
循环(for_each)、查询(find)、计数(count)、比较(equal)。(简而言之就是不对数据进行直接改写,换言之间接改写是可以的)


第九章 变异算法
·变异算法,即变异函数的主要特点是修改容器中的元素。如修改容器中的元素值,改变容器中的元素序列等。
按照功能划分内容:
复制(copy),交换(swap),变换(transform),替换(replace),填充(fill),生成(generare),删除(remove),唯一(unique),反转(reverse),环移(rotate),随机(random),划分(partition)。
·复制函数copy,根据说明[frist,last),是左开右闭,所以如果copy数组a[5],那么参数应该是a,a+5而不是a+4。
·变换就是把元素挨个送进函数中处理,返回处理后的数值保存。
·getline()函数在string头文件中。
·利用函数对象可以封装许多初始化信息,隐蔽性、封装性更好,因此优于全局函数。(生成算法中,斐波那契数列的例子,全局函数不能生成第二个数列)
·删除的本质是覆盖,用非指点元素前移覆盖需要删除的元素,执行完毕后容器总长度依旧不变。
·由于list容器的内部迭代器是双向迭代器,所以元素4的迭代器位置不能用middle = v2.begin() +3 表示,只有随机迭代器如vector中的迭代器才能执行operate + (n)操作,但是可以用系统函数advance轻松实现。(list容器的迭代器只可以++,不能一次性移很多位,这点要注意)
·list容器常用两个函数,advance迭代器随机访问,distance两迭代器之间有多少个元素。


第十章 排序
·list容器不能用sort通用排序算法。这是由于sort需要的是随机迭代器,方便排序算法中的数据交换,而list提供的仅是双向迭代器。
·第n个元素算法,主要功能是对一组数据中,只挑一个迭代器位置将排序后应该在这里的元素移动到这里,但是其他元素并没有进行排序。
·本章大部分函数都要求容器元素已经排序好后才能调用,否则会运行错误。
·堆实际上就是一组序列按完全二叉树顺序存放在一位数组中,并且满足父节点小于(大于)等于子节点,称为最小堆(最大堆)。
·排列生成器,在排列组合出不同的N位数间切换大小最近的两个排列。(应该会经常用到,需要记住)
·泛型编程需要临时变量时,一定要用到_Val_type()这个函数,它可以根据迭代器指针返回指针指向的数据类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值