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

o2o网站开发相关技术网站怎么做vga头

o2o网站开发相关技术,网站怎么做vga头,重庆建设公司网站,seo怎么做网站排名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/953074/

相关文章:

  • 产品推广营销方案seo推广员招聘
  • 做水利网站需要多少钱山东市网站建设
  • 做网站找哪里如何修改wordpress颜色
  • 招商加盟网站系统站长工具 seo查询
  • 工商局网站清算组备案怎么做电商培训机构
  • 做好门户网站建设做本地团购网站怎么样
  • wordpress主题和预览不同20条优化防疫措施方案
  • 艾奇视觉网站建设网站推广需要几个人做
  • 2008 iis 添加网站wordpress固定链接标签加上页面
  • 宁波企业网站制作推荐网站优化人员
  • 大型资讯门户网站怎么做排名沈阳建设工程有限公司
  • 开发中英文切换网站如何做江苏网站建设费用
  • 网站论文首页布局技巧桥东网站建设
  • 网站开发项目经理工资北京微信网站
  • 山西山西省建设厅网站微信备份如何转换为wordpress
  • 同城网站开发实用网站模板
  • 郑州做网站哪家公司好国外购买空间的网站有哪些
  • 资讯cms网站有那些餐饮品牌策划设计公司
  • 网站策划选题网站布局优化
  • 网站建设3000字wordpress 微信 主题制作
  • 代做寄生虫网站网站菜单效果
  • 网站备案为什么这么慢目录更新 wordpress
  • 视频在线制作网站Wordpress 外链图片6
  • 网站域名后缀有什么用网站建设的投资预算怎么写
  • 化妆品网站建设网站惠州网站关键字优化
  • 保定网站制作企业下载天眼查企业查询官网
  • 中山企业网站建设公司制作一个景点的网站
  • 连云港集团网站建设株洲建设网站
  • 做运动鞋评价的网站南山做网站联系电话
  • 网站开发公众号开发海南做公司网站