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

申请个人网站怎么申请东莞建设公司网站

申请个人网站怎么申请,东莞建设公司网站,网页设计网站规划报告,北京建设监理网站STL const_iterator等价于指向常量的指针#xff08;pointer-to-const#xff09;。它们都指向不能被修改的值。标准实践是能加上const就加上#xff0c;这也指示我们需要一个迭代器时只要没必要修改迭代器指向的值#xff0c;就应当使用const_iterator。 上面的说法对C11…STL const_iterator等价于指向常量的指针pointer-to-const。它们都指向不能被修改的值。标准实践是能加上const就加上这也指示我们需要一个迭代器时只要没必要修改迭代器指向的值就应当使用const_iterator。 上面的说法对C11和C98都是正确的但是在C98中标准库对const_iterator的支持不是很完整。首先不容易创建它们其次就算你有了它它的使用也是受限的。假如你想在std::vectorint中查找第一次出现1983C代替C with classes的那一年的位置然后插入1998第一个ISO C标准被接纳的那一年。如果vector中没有1983那么就在vector尾部插入。在C98中使用iterator可以很容易做到 std::vectorint values; … std::vectorint::iterator it std::find(values.begin(), values.end(), 1983); values.insert(it, 1998);但是这里iterator真的不是一个好的选择因为这段代码不修改iterator指向的内容。用const_iterator重写这段代码是很平常的但是在C98中就不是了。下面是一种概念上可行但是不正确的方法 typedef std::vectorint::iterator IterT; //typedef typedef std::vectorint::const_iterator ConstIterT;std::vectorint values; … ConstIterT ci std::find(static_castConstIterT(values.begin()), //caststatic_castConstIterT(values.end()), //cast1983);values.insert(static_castIterT(ci), 1998); //可能无法通过编译//原因见下typedef不是强制的但是可以让代码中的cast更好写。你可能想知道为什么我使用typedef而不是条款9提到的别名声明因为这段代码在演示C98做法别名声明是C11加入的特性 之所以std::find的调用会出现类型转换是因为在C98中values是non-const容器没办法简简单单的从non-const容器中获取const_iterator。严格来说类型转换不是必须的因为用其他方法获取const_iterator也是可以的比如你可以把values绑定到reference-to-const变量上然后再用这个变量代替values但不管怎么说从non-const容器中获取const_iterator的做法都有点别扭。 当你费劲地获得了const_iterator事情可能会变得更糟因为C98中插入操作以及删除操作的位置只能由iterator指定const_iterator是不被接受的。这也是我在上面的代码中将const_iterator我那么小心地从std::find搞出来的东西转换为iterator的原因因为向insert传入const_iterator不能通过编译。 老实说上面的代码也可能无法编译因为没有一个可移植的从const_iterator到iterator的方法即使使用static_cast也不行。甚至传说中的牛刀reinterpret_cast也杀不了这条鸡。它不是C98的限制也不是C11的限制只是const_iterator就是不能转换为iterator不管看起来对它们施以转换是有多么合理。不过有办法生成一个iterator使其指向和const_iterator指向相同但是看起来不明显也没有广泛应用在这本书也不值得讨论。除此之外我希望目前我陈述的观点是清晰的const_iterator在C98中会有很多问题不如它的兄弟指iterator有用。最终开发者们不再相信能加const就加它的教条而是只在实用的地方加它C98的const_iterator不是那么实用。 所有的这些都在C11中改变了现在const_iterator既容易获取又容易使用。容器的成员函数cbegin和cend产出const_iterator甚至对于non-const容器也可用那些之前使用iterator指示位置如insert和erase的STL成员函数也可以使用const_iterator了。使用C11 const_iterator重写C98使用iterator的代码也稀松平常 std::vectorint values; //和之前一样 … auto it //使用cbeginstd::find(values.cbegin(), values.cend(), 1983); //和cend values.insert(it, 1998);现在使用const_iterator的代码就很实用了 唯一一个C11对于const_iterator支持不足译注C14支持但是C11的时候还没的情况是当你想写最大程度通用的库并且这些库代码为一些容器和类似容器的数据结构提供begin、end以及cbegincendrbeginrend等作为非成员函数而不是成员函数时。其中一种情况就是原生数组还有一种情况是一些只由自由函数组成接口的第三方库。译注自由函数free function指的是非成员函数即一个函数只要不是成员函数就可被称作free function最大程度通用的库会考虑使用非成员函数而不是假设成员函数版本存在。 举个例子我们可以泛化下面的findAndInsert templatetypename C, typename V void findAndInsert(C container, //在容器中查找第一次const V targetVal, //出现targetVal的位置const V insertVal) //然后在那插入insertVal {using std::cbegin;using std::cend;auto it std::find(cbegin(container), //非成员函数cbegincend(container), //非成员函数cendtargetVal);container.insert(it, insertVal); }它可以在C14工作良好但是很遗憾C11不在良好之列。由于标准化的疏漏C11只添加了非成员函数begin和end但是没有添加cbegincendrbeginrendcrbegincrend。C14修订了这个疏漏。 如果你使用C11并且想写一个最大程度通用的代码而你使用的STL没有提供缺失的非成员函数cbegin和它的朋友们你可以简单的写下你自己的实现。比如下面就是非成员函数cbegin的实现 template class C auto cbegin(const C container)-decltype(std::begin(container)) {return std::begin(container); //解释见下 }你可能很惊讶非成员函数cbegin没有调用成员函数cbegin吧我也是。但是请跟逻辑走。这个cbegin模板接受任何代表类似容器的数据结构的实参类型C并且通过reference-to-const形参container访问这个实参。如果C是一个普通的容器类型如std::vectorintcontainer将会引用一个const版本的容器如const std::vectorint。对const容器调用非成员函数begin由C11提供将产出const_iterator这个迭代器也是模板要返回的。用这种方法实现的好处是就算容器只提供begin成员函数对于容器来说C11的非成员函数begin调用这些成员函数不提供cbegin成员函数也没问题。那么现在你可以将这个非成员函数cbegin施于只直接支持begin的容器。 如果C是原生数组这个模板也能工作。这时container成为一个const数组的引用。C11为数组提供特化版本的非成员函数begin它返回指向数组第一个元素的指针。一个const数组的元素也是const所以对于const数组非成员函数begin返回指向const的指针pointer-to-const。在数组的上下文中所谓指向const的指针pointer-to-const也就是const_iterator了。  回到最开始本条款的中心是鼓励你只要能就使用const_iterator。最原始的动机——只要它有意义就加上const——是C98就有的思想。但是在C98它译注const_iterator只是一般有用到了C11它就是极其有用了C14在其基础上做了些修补工作。 请记住 优先考虑const_iterator而非iterator在最大泛型代码中优先考虑非成员函数版本的beginendrbegin等而非同名成员函数
http://www.w-s-a.com/news/362827/

相关文章:

  • appserv做网站教程微信信息流广告案例
  • 前端网站开发兼职长春火车站地下停车场收费标准
  • 苏州推广网站建设概况大连公交app
  • 移动互联网站开发与维护招聘网站建设计入什么费用
  • 郑州营销型网站建设erp系统有什么用
  • 公司网站开发费怎么入账投放广告网站
  • 企业网站开发文献综述加盟网网站建设策划书
  • 最便宜的网站空间网站建设和app开发
  • 承装承修承试材料在哪个网站做如何用虚拟主机建设网站
  • 如何建一个外贸网站网页设计零基础学习课程
  • 营销型外贸网站广州昆明建设网站制作
  • 网页制作网站素材项目建设全过程管理
  • 正能量网站下载柬埔寨网赌网站开发
  • 如何免费建设公司网站广州传业建设有限公司网站
  • 织梦做的网站快照被攻击张家口网站建设公司
  • 平顶山公司网站建设南昌网站seo多少钱
  • 网站开发要先买服务器吗建设婚恋网站用什么搭建
  • 我想自己在网站上发文章 怎样做wordpress站点安装
  • 北京模板网站开发全包昆明网站开发正规培训
  • 西咸新区建设环保网站谷歌风格wordpress
  • 嘉兴港区建设局网站2018年网站开发
  • 网站里图片做超链接专业开发网站报价单
  • server2003网站建设做销售记住这十句口诀
  • microsoft免费网站网站后台登陆路径
  • 贵州住房和城乡建设局网站做网站排名费用多少钱
  • 现在个人做网站还能盈利吗xampp用wordpress
  • 做网站 租服务器温岭建设公司网站
  • 四川住房和城乡建设厅网站官网做网站最贵
  • 右玉网站建设四川林峰脉建设工程有限公司网站
  • 网站推广小助手杭州百度百家号seo优化排名