栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CS100 Recitation 13 STL、运算符重载 gkxx

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CS100 Recitation 13 STL、运算符重载 gkxx

一、STL剩余内容

STL的组成:

容器分为 顺序容器 和 关联容器

有序关联容器的实现原理和 红黑树 有关

无序关联容器的实现原理和 哈希表 有关

迭代器、算法、适配器(Adapters) 、空间配置器(allocators)、仿函数(Functors)

1、容器

注意std::find返回的是一个迭代器

MAP

注意,这里的下标不一定是数字,map很像python中的dictionary

2、迭代器

插入迭代器

 必须保证v2里面有足够的空间!!STL中很多算法都不会改变容器的空间

用resize来改变空间即可!

 尾插元素:

利用插入迭代器back_inserter

 类似于对v2进行多次push_back

流迭代器 stream iterators

 eof表示输入流的终止

这些迭代器都定义在头文件里

复习:iterator catogories

 可以拿forward-iterators反反复复的遍历序列

但是input-iterators是一次性的,输入的数据读了就没了

所以上面个的这个问题,对于forward是对的,但对于input就不对,因为对于input在解引用之后iter就没了

3、特殊算法

对于链表来说,std::sort做不到

因为链表提供的是bidireactional iterator,而不是random的

 链表排序,用std::list::sort就可以啦!

好处:不要求链表数据可交换,而且是稳定排序

稳定排序:相同关键字的元素在排序后相对位置保持不变

 

链表的操作↑

4、空间配置器 

 提供一套统一的接口

 

例如,vector默认使用标准的std::allocator

而我也可以写一个自己的特殊的空间配置器


二、运算符重载

1、函数调用运算符

 注意上面有三个运算对象:adder, 42, 35

 注意:当我们把重载的函数写成成员函数时,这n个运算对象中最左边的那个会绑定到this指针,从第二个运算对象开始才会从左到右依次绑定到参数上

Adder{} 或者Adder() 就是默认构造了一个对象

这样的类的对象 就是一个仿函数 (装的像个函数一样)

它的意义是什么?

如下面的应用场景:

 2、算术 关系运算符

 

 

 

 因为0肯定不是一个对象,没有0==(r)

 所以说,当所有参数都需要隐式转换时,应该把函数设置成非成员

3、递增递减运算符

研究一下加加

加加 减减 都是单个运算对象  通常把函数定义为成员函数,因为要改变成员的状态

 其中,后置递增运算符的重载中

 这个int只是一个占位符 tag  表示这是后置递增运算符 没有额外的意义

显然,前置递增运算符返回的是自身的引用

而后置递增运算符返回的是拷贝的递增之前的对象

很妙的地方,是后置递增的重载中依赖了前置递增

 这样debug很方便

4、解引用、箭头运算符

 箭头运算符重载比较特殊,就是这么个格式,记住就行

为什么要用addressof呢?(定义在中)

因为我们不知道T到底是个什么类型,万一这个类型重载了取地址运算符,就糟糕了

而addressof能保证一定能娶到地址

5. 类型转换运算符重载

注意这个重载函数中 返回值类型可以不写 因为肯定是double

但是 也会有问题出现:

 下面会出现一个奇怪的能够通过编译的情况:

 因为std::cin会变成bool,bool变成int,两个int通过<<进行移位的操作

为了禁止这种隐式的类型转换,我们引入explicit

 避免二义性

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928946.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号