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

贵阳营销网站建设公司代写新闻稿

贵阳营销网站建设公司,代写新闻稿,node.js可以做网站么,外贸网站平台都有哪些1.前言 STL主要由“用以表现容器#xff0c;迭代器和算法”的template构成#xff0c;但也覆盖若干工具性templates#xff0c;其中一个名为advance#xff0c;用来将某个迭代器移动某个给定距离#xff1a; tempaltetypename IterT,typename DistT//将迭代器向…1.前言 STL主要由“用以表现容器迭代器和算法”的template构成但也覆盖若干工具性templates其中一个名为advance用来将某个迭代器移动某个给定距离 tempaltetypename IterT,typename DistT//将迭代器向前移动d单位 void advance(IterT iter,DistT d);//如果d0则向后移动 观念上advance只是做iterd动作但其实不可以全然是那样因为只有random access(随机访问)迭代器才支持操作。面对其它迭代器种类advance必须反复施行或--共d次。 先回顾下STL迭代器的分类STL共有5种迭代器分类inpiut迭代器只能向前移动一次一步客户可只读取它们所指的变量而且只读取一次他们模仿指向输入文件的阅读指针(read pointer)c程序库中的istream_iterators是这一分类的代表。output迭代器情况类似但一切只为输出它们只向前移动一次一步客户只涂写一次。它们模仿指向输出文件的涂写指针write pointerostream_iterators是这一分类的代表。这是功能最小的两个迭代器分类。由于这两类都只能向前移动而且只能读或写其所指物最多一次所以它们只适合“一次性操作”one-pass algorithms。另一个功能比较强大的分类是forward迭代器。这种迭代器可以做前述两种分类所能做的每一件事而且可以读或写其所指物一次以上。这使得它们可以施行于多次性操作算法(multi-pass algorithms)。STL并未提供单向linked list,但某些程序库有slit,而置入这种容器的迭代器就是属于forward迭代器。指入TR1 hashed容器的也可能是这一分类。 Bidirectional迭代器比上一个功能更大它除了可以向前移动还可以向后移动。STL的list迭代器就属于这一类set,multiset,map和multimap的迭代器也都是这一分类。 最强大的迭代器当属random access迭代器。这种迭代器功能强大之处再与它可以执行“迭代器算术”即可以在常量时间内向前或向后跳跃任意距离。 对这5种分类c标准程序库分别提供专属的卷标结构tag struct加以确认 struct input_iterator_tag{}; struct output_iterator_tag{}; struct forward_iterator_tag:public input_iterator_tag{}; struct bidirectional_iterator_tag:public forward_iterator_tag{}; struct random_access_iterator_tag:public biairectional_iterator_tag{}; 这些struct之间的继承关系是有效的is-a。 现在回到advance函数我们知道STL迭代器有着不同的能力实现advance的策略之一是采用“最低但最普及”的迭代能力以循环往复递增或递减迭代器。然而这种做法耗费线性时间我们知道random access迭代器支持迭代器算术运算只耗费常量时间如果面对这种迭代器我们希望运用其优势 然而我们真正希望的是以这种方式实现advance templatetypename IterT,typename DistT void advance(IterT iter,DistT d) {if(iterT iter,DistT d){if(iter is a random access iterator){iterd;//针对random access迭代器使用迭代器算术运算}else{if(d0){while(d--) iter;}else{if(d0){while(d--) iter;}else {while(d) --iter;}//针对其它迭代器分类反复调用或--}}}} 这种做法首先是必须判断iter是否未random access迭代器也就是说需要知道类型IterT是否为random access迭代器。换句话说我们需要取得类型的某些信息。那就是traits让你得以进行的事情它们允许你在编译期间取得某些类型信息。。 2.实例分析 traits并不是c关键自或一个预先定义好的构件他们是一种技术也是一个c程序员共同遵守的协议。这个技术的要求之一是他对内置(built-in)类型或用户自定义类型的表现必须一样好。举个例子如果上述advance仍然必须有效运作那意味这traits技术必须i能够施行于内置类型如指针上。 ”traits必须能够施行于内置类型“意味”类型内的嵌套信息nesting information“这种东西必须出局了因为我们无法将信息嵌套于原始指针内。因此类型的traits信息必须位于类型自身之外。标准技术时把它放进一个template及其一个被命名为iterator_traits: templatetypename iterT//template用来处理 struct iterator_traits;//迭代器分类的相关信息 正如所看到的iterattor_traits是个struct。习惯上traits总是被实现为structs,但它们又往往被称为traits classes。 iterator_traits的运作方式是针对每一个类型IterT,针对每一个类型IterT,在struct iterator_traitsIterT内一定声明某个typedef名为iiterator_category这个typedef用来确认IterT的迭代器分类。 iterator_traits以两个部分实现上述所言。首先它要求每一个“用户自定义的迭代器类型”必须嵌套一个typedef名为iterator_category用来确认适当的卷标结构。例如deque的迭代器可随机访问所以一个针对deque迭代器而设计的class看起来会是这个样子 template... class deque{public:class iterator{public:typedef random_access_iterator_tag iterator_category;....};.... }; list的迭代器可双向行进所以它们应该是这样的 template... class list{public:class iterator{public:typedef bidirectional_iterator_tag iterator_category;....};.... }; 至于iterator_traits只是相应iterator class的嵌套式typedef: //类型IterT的iterator_category其实是用来表现“IterT说它自己是什么” //关于“typedef typename”的运用见条款42 templatetypename IterT struct iterator_traits{typedef typename IterT::iterator_category iterator_category;... }; 这对用户自定义类型行得通但对指针也是一种迭代器行不通因为指针不可能嵌套tepedef。iterator_traits的第二部分如下专门用来对付指针 为了支持指针迭代器iterator_traits特别针对指针类型提供一个偏特化版本partial template specialization。由于指针的行径与random access迭代器类似所以iterator_traits为指针指定的迭代器类型是 templatetypename IterT//template偏特化 struct iterator_traitsIterT*//针对内置指针 {typedef random_access_iterator_tag iterator_category;.... }; 现在我们应该了解了如何设计并实现一个traits class了 1确认若干你希望可取的的类型相关信息。例如对迭代器而言我们希望将来可取其分类category; (2)为该信息选择一个名称比如iterator_category (3)提供一个template和一组特化版本内含你希望支持的类型相关信息。 现在有了iterator_traits实际上是std::iterator_traits因为它是c标准程序的一部分我们可以对advance实践先前的伪码pseudocode: templatetypename IterT,typename DistT void advance(IterT iter,DistT d) {if(typeid(typename std::iterator_traitsIterT::iterator_category)typeid(std::random_access_iterator_tag)).... } 虽然这看起来前景光明但并不是我们想要的。首先会导致编译问题。IterT类型在编译器间获知所以iterator_traitsIterT::iterator_category也可以在编译器间确定。但if语句却是在运行期才会核定。 我们真正想要的是一个条件式判断“编译器核定成功”之类型。恰巧c有一个取得这种行为的办法那就是重载(overloading)。 当我们重载某个函数f必须详细描述各个重载建房的参数类型。当你调用f编译器便根据传来的实参选择最适合的重载件。编译器的态度是“如果这个重载件最匹配传递过来的实参就调用这个f如果那个重载件最匹配就调用那个f如果第三个f最匹配就调用第三个f”。依次类推。这正是一个针对类型而发生的“编译器条件句”。为了让advance的行为如我们所期望的那样我们需要做的是产生两版重载函数内含advance的本质内容但各自接受不同类型的iterator_category对象。我将这两个函数取名为doAdvance: templatetypename IterT,typename DistT//用于random access 迭代器 void doAdvance(IterT iter,typename Dist,std::random_access_iterator_tag) {iterd; }templatetypename IterT,typename DistTstd::bidirectional_iterator_tag//这份 { //实现用于bidirectional迭代器if(d0){while(d--)iter;}else{while(d) --iter;}} templatetypename IterT,typename DistT//这份用于实现input迭代器 void doAdvance(IterT iter,DistT d,std::input_iterator_tag) {if(d0){throw std::out_of_range(Negative distance);}while(d--) iter; } 由于forward_iterator继承自input_iterator_tag所以上述doAdvance的input_iterator_tag版本也能够处理forward迭代器。这是iterator_tag structs继承关系带来的一项红利。实际上这也是public继承带来的部分好处针对base class编写的代码用于derived class身上行得通。 advance函数规范说如果面对的是random access和bidirectional迭代器则接受正距离和负距离但如果面对的是forward或input迭代器则移动负距离会导致不明确未定义行为。我所检验过的实现码都假设d不为负于是直接进入一个冗长的循环迭代等待计数器降为0。上述异常我以抛出异常取而代之。 有了这些doAdvance重载版本advance需要做的是调用它们并额外传递一个对象后者必须带有适当的迭代器分类。于是编译器运用重载解析机制overloading resolution调用适当的实现代码 templatetypename IterT,typename DistT void advance(IterT iter,DistT d) {doAdvance(iter,d,typename std::iterator_traitsIterT::iterator_category()); } 现在我们可以总结如何使用一个traits class了 1建立一组重载函数或函数模板彼此间的差异只在于各自的traits参数。令每个函数实现码与其接受之traits信息相应和。 2建立一个控制函数或函数模板它调用上述那些劳工函数并传递traits class所提供的信息。 traits广泛用于标准程序库其中当然有上述讨论的iterator_traits除了供应iterator_category还供应另四分迭代器相关信息。此外还有char_traits用来保存字符类型相关信息以及numeric_limits用来保存数值类型的相关信息例如某些数值类型可表现之最小值和最大值等等命名为numeric_limits有点让人惊讶因为traits classes的名称以traits结束但numeric_limits却没有遵守这种风格。 3.总结 1Traits classes使得“类型相关信息”在编译器可用。它们以template和“templates特化”完成实现。 2整合重载技术后traits classes有可能在编译器对类型执行if...else 测试。
http://www.w-s-a.com/news/776337/

相关文章:

  • 淄博网站制作优化推广asp做学生信息网站
  • 海口招商建设有限公司网站淮安哪有专业做网站的公司
  • 喀什哪有做网站的国内正规seo网络推广
  • 网站设计初步规划公司网页打不开是什么原因
  • 深圳企业网站建设推广服务php做的商城网站设计论文
  • 韩雪冬网站手机网站开发 宽度
  • 奉贤专业做网站新手怎么做企业网站
  • 做网站用哪几个端口 比较好手机号网站源码
  • 手机免费代理ip网站那个旅游网站做攻略最好
  • 西安做网站找哪家公司好苏州专业网站建设开发
  • dedecms如何做网站网站设计实施方案
  • 网站建设合约品牌设计有哪些
  • 织梦企业门户网站宝塔搭建wordpress网站
  • 网站为什么没有排名了11月将现新冠感染高峰
  • 网站开发维护专员岗位职责辽阳企业网站建设
  • 做外国订单有什么网站网站设计论文提纲
  • 商城网站建设报价方案导师让做网站
  • 清远市企业网站seo联系方式动易官方网站
  • 手机上怎么做能打开的网站一级域名和二级域名跨域
  • 网站首页效果图wordpress 在线教育
  • 电商网站开发团队广西桂林商贸旅游技工学校
  • 网站模板文件怎么下载东莞常平镇邮政编码
  • 建网站需要什么wordpress误删的后果
  • wordpress无插件实现网站地图做阿里巴巴网站店铺装修费用
  • 英文互动网站建设南宁住房和城乡建设局网站
  • 威海微网站建设乐清建网站哪家强
  • 网站和app的开发成本saas系统开发教程
  • ps切片工具做网站大气简洁网站
  • 网至普的营销型网站建设wordpress邮箱验证插件下载
  • 找权重高的网站方法张家港早晨网站建设