当前位置: 首页 > news >正文

怎么有自己公司网站域名iphone怎么开通互联网

怎么有自己公司网站域名,iphone怎么开通互联网,合肥房产网安居客,浙江嘉兴建设局网站文章目录 前言反向迭代器反向迭代器和正向迭代器的区别stl反向迭代器源码反向迭代器模拟实现测试 模板进阶非类型模板参数Array 模板的特化模板的分离编译 前言 模板进阶也没有到一些特别的东西#xff0c;就是讲比较偏的一些特性。 在这里我们先来讲一下反向迭代器。 反向迭… 文章目录 前言反向迭代器反向迭代器和正向迭代器的区别stl反向迭代器源码反向迭代器模拟实现测试 模板进阶非类型模板参数Array 模板的特化模板的分离编译 前言 模板进阶也没有到一些特别的东西就是讲比较偏的一些特性。 在这里我们先来讲一下反向迭代器。 反向迭代器 反向迭代器和正向迭代器的区别 严格来说没有大的区别。真正的区别在于或者- -的方向不一样。 它是倒着走的。 如果是list, 以我们自己的思路实现我们会怎么做 我们可能有这样一个思路我们把正向迭代器拷贝一份出来名字变一下其他保持不变。 再把反向迭代器的变成node node-prev; 就是增加一个类的思路。 这样行不行呢我们可以测试一下。 我们再提供一个rbegin(), rend(); 最后测试一下 好像还可以就这么esay.但是还是太年轻太简单了。 我们普通人写的代码还得看一下高手写的代码在实践中进步 stl反向迭代器源码 我们看一下stl的源码。 它没有像我们前面一样实现一个类。 它的反向迭代器是这样实现的。 这怎么传了一个正向迭代器过去。 这是个类模板。 还得接着从源码中找。 用适配器。 发现stl极度的讨厌冗余重复的设计。 看源码。 也就是说你用一个正向迭代器就可以构造一个反向迭代器。 然后看这里就是正向迭代器的- -, - -就是正向迭代器的 但是这里又有一个诡异的东西。 它的解引用没有取当前位置它取了前一个位置。 正向和反向的区别来了。 看结构就已经知道为解引用是取前一个位置 反向迭代器模拟实现 现在的思路跟之前不一样了还是写一个类但是我现在是用一个正向迭代器取构造一个反向迭代器。 现在重点在于反向迭代器的是正向迭代器的- - templateclass Iterator struct ReverseIterator {typedef ReverseIteratorIterator Self;Iterator _cur;ReverseIterator(Iterator it):_cur(it){}Self operator(){--_cur;return *this;}Self operator--(){_cur;return *this;}//内核比较的还是指针bool operator!(const Self s){return _cur ! s._cur;} };正向迭代器在物理上是个啥东西它多大 4个字节就是个指针只是自定义类型封装。 内置类型*it直接变成指令直接调用那个地址的内容去解引用自定义类型调用函数。 反向迭代器在物理上是多大 也是四个字节。 类型的力量都是4个字节存一个地址但是三个不同的物种。 现在麻烦的东西来了。 返回前一个位置这很好处理现在返回值是最难处理的。 这个位置需要T或者const T 可以看一下源码是怎么处理的但是源码用的到东西远超我们目前的水平所以我们不这样搞。 现在我们用一个简单的方式去解决加两个模板参数就解决了。 templateclass Iterator, class Ref, class Ptrtypedef ReverseIteratorIterator, Ref, Ptr Self;Ref operator*() {Iterator tmp _cur;--tmp;return *tmp; }至此反向迭代器就成型了我们就可以不用重复的方式了。 测试 接着我们在自己模拟实现的list当中测试一下。 好了。 两种实现方式的比较 关键点来了好像这两种实现方式没有什么差别都是实现一个类。 第一种方式实现了一个正向迭代器我把正向迭代器拷贝下来再改一下就实现了。 第二种方式第二种方式用正向迭代器去初始化一个反向迭代器。 用正向迭代器去初始反向迭代器。那反向迭代器是不是包含一个正向迭代器对象。 最关键的地方来了。vector的反向迭代器怎么搞 难道像第一种方式一样吗不行因为vector的迭代器本身就是内置类型搞定。 但是第二种方式可以。 反向迭代器搞适配最重要的原因就是为了真正复用 给出list的正向迭代器可以适配出反向迭代器。那vector呢 其实你实现除了一个反向迭代器所以容器的反向迭代器都出来了 只要你有正向迭代器你的正向迭代器能支持- -也就是双向迭代器。 跟你的迭代器是原生指针还是自定义类型没有什么关系。 模板进阶 首先我们要把自己的视角打开一些不能局限于只是类型的概念。 还有我们前面学到的适配器仿函数这些。 我们前面讲的那些参数叫做模板参数准确点叫做类型模板参数。 今天我们还要讲一个非类型模板参数。 非类型模板参数 这个非类型模板参数在什么地方有用呢 假设我需要写一个静态的数组。以前的方式。 好像非常好那假设N一个要10一个要100是不是解决不了。 所以引入了非类型模板参数它不是类型它是常量准确来说是整型常量。 // 类型模板参数 // 非类型模板参数 -- 整形常量 templateclass T, int N 20 class Array { public:private:T _a[N]; }; int main() {Arrayint, 10 a1;Arraydouble, 20 a1;return 0; }所以它还是很方便。 它针对的是有些容器一开始就想去固定一些东西。 比如 非类型模板只能是整型常量,而且只能是右值。 int, char,bool, long, long这些都属于整型家族。 用了非类型模板参数就不怎么需要typedef Array 给大家看一个新东西C11增加了一个新容器。 Array是一个静态数组一个固定大小的顺序容器。 这东西怎么用呢 C设计出这个是为了对标vector吗 它对标的是C语言的静态数组它对比静态数组的优势是什么 它对越界的检查更加严格 它怎样做到全面检查的 很简单你传的标识符是一个内置类型它不需要解引用。 它是一个函数调用它里面可以对这个参数进行检查。 这里有一个挺有意思的点我为什么要用这个Araay.我直接用vector还可以初始化。 vectorint v(10, 0); v[10];唯一有点区别的就是array的空间是在栈上以为它是直接开一个数组。 vector是在堆上它要动态申请一下。 动态申请效率也很高array在栈上还可能把栈本来就不大堆很大。 模板的特化 有些地方有需求我们想对某些类型进行特殊处理。 比如我们比较日期类 但是这个比较好像并不满足我的需求 我还是希望按日期去比较但是它现在是日期的指针日期的指针本身也是可以比较的但是它比较的方式并不符合需求。我还是想要用实际的日期来比较。 那怎么办 不用仿函数还有别的方式吗 我们可以用模板特化的语法。 这种写法的意思就是你不用日期的指针就用原来那个。 你是日期的指针我就用特化的那个。 模板针对的是广泛的类型但是我们可能想对某些类型进行特殊处理。 上面的函数模板是可以不用特化的 这两个是可以同时存在的只是它跟模板实例化出来的函数构成函数重载。 刚才用的是特化这个是匹配。 虽然好像可以用这个匹配替换掉特化但是特化的用途还是非常大的。 再给大家看一个场景 这是我们我们讲仿函数时举过的一个例子。 我不想写这个仿函数我有没有其他的方式。 我们可以用特化的方式。 Date*可以调用这个特化版本。 函数模板特化的意义好像确实不大但是类模板很有意义。 再看一个应用场景 这是一个仿函数 特化除了我们之前的玩法还有一个更宽泛的玩法。 之前专门特化了Date*,现在还能这样特化。 这个特化叫做偏特化它和前面的特化有什么区别呢 刚才的特化是针对T实例成具体的Date*,它是针对具体的类型。 现在对她进行进一步的限制所以叫做偏特化。 它是针对指针这个泛类。 如果你写全特化要写好几个。现在只要你是指针都可以解引用我都不是用指针比较我是用指针比较的对象比较。 特化就是要对某些类型处理但不一定是具体的类型它可以是泛的类型比如指针。 1.当全特化和偏特化同时存在的时候走哪个 肯定是走全特化全特化是现成的… 2.当它们同时存在的时候有没有意义 有一定的意义。 模板的分离编译 模板不支持分离编译这个我们在前面的文章是有提到的。 我们这里说的不支持分离编译是在两个文件声明在.h文件定义在.cpp文件。 为什么 模板会报链接错误。 fatal error 我们怎么来看待这个链接错误呢 首先我们得先分析一下程序会发生什么。 我们还得搞懂为什么普通函数可以函数模板不可以或者普通类可以类模板不可以 刚开始走的都是单线后面两条线进行交互除了合并还做一件很重要的事情链接。 大家注意func.i生成fun.o的时候生成一堆汇编指令但是它只能生成func的生不成Add的。 为什么它生不成Add的 现在其实就已经可以解释为什么链接错误了因为没有Add的地址。 怎么解决呢 编译不通过就是找不到函数的地址为什么找不到函数的地址呢? 不知道怎么实例化。 那告诉它怎么实例化就可以了 第一种解决方案 显示实例化 但是这样很不好用 更好的方式 第二种方式 可以声明和定义分离但是不要分离到两个文件 上面是函数模板类模板呢 可以参考一下stl的源码。 模板只定义在一个文件。 继续看其他的比较短小的函数直接在类里面定义为什么 类里面默认就是类联短小的适合类联。 比较长一点的就在类里面声明类外面定义。 为什么我放在.h就不存在链接错误 因为.h在函数调用的地方展开。 Add()只有声明所以变成call(?),没有地址然后链接的时候去找。 那这个函数有没有地址 有因为我既有声明又有定义。有定义就不需要找了直接实例化然后在当前函数就生成地址。
http://www.pierceye.com/news/99513/

相关文章:

  • 网站建设课程体会国内最新新闻简短
  • 网站开发大概价格最常用的网页制作软件
  • 商务网站模块设计时前台基础设施建设免费网站建设空间
  • 青海省公路工程建设总公司网站饮料公司网站模板
  • 建设部网站刘赵云网页版邮箱
  • 免费扑克网站企业网站怎么搜索优化
  • 做网站导航的厦门网站建设制作多少钱
  • 怎样免费注册网站域名鹤城建设集团网站
  • 3合1网站建设价格网站建设论坛快速建站
  • 怎样做钓鱼网站上海网站关键词排名优化报价
  • 昆明专业网站设计公司电商类网站设计模板
  • 网站流量用完了重庆网站推广
  • 网站管理助手数据库网站在建设中无法访问
  • 网站标题格式建设网站南昌
  • wordpress作企业网站好吗沈阳短视频制作公司
  • 表格网站怎么做的作文网站大全
  • 比特币网站建设专业网站建设企业网站制作
  • 故宫博物院官网网站咋做的山东省济宁市最新消息
  • 天河营销型网站建设html网页设计代码作业正能量
  • 国外网站设计欣赏智能获客系统
  • 济南网站建设599网站建设完工后在什么科目核算
  • 学校网站的作用app营销推广方式
  • 怎么做网站互换链接重庆工程建设信息网官网查询
  • 刚开始做网站要传数据库吗赛迪建设网站
  • 网站网络推广教程手机html网站开发视频
  • 网站弹出广告代码口碑好的龙岗网站建设
  • 东莞网站建设-搜盟网电商的运营推广
  • 美发网站 源代码网站建设的博客
  • 做电影视频网站赚钱嘛安溪人做的网站
  • 网站建设基础代码赣州专门网公司