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

官方网站拼多多重庆施工员证书查询官方网站

官方网站拼多多,重庆施工员证书查询官方网站,郑州发布紧急通告,wordpress教程网模板Effective STL 1. 容器条例01#xff1a;慎重选择容器类型条例02#xff1a;不要试图编写独立于容器类型的代码条例03#xff1a;确保容器中对象的拷贝正确而高效条例04#xff1a;调用empty而不是检查size()是否为空条例05#xff1a;区间成员函数优先于与之对应的单元素… Effective STL 1. 容器条例01慎重选择容器类型条例02不要试图编写独立于容器类型的代码条例03确保容器中对象的拷贝正确而高效条例04调用empty而不是检查size()是否为空条例05区间成员函数优先于与之对应的单元素成员函数条例06当心C编译器最烦人的分析机制条例07如果容器中包含了通过new操作创建的指针切记在容器对象析构前将指针delete掉条例08切勿创建包含auto_ptr的容器对象 条例09慎重选择删除元素的方法 条例10了解分配子的限制与约定 条例11理解自定义分配子的合理用法 条例12切勿对STL容器的线程安全性有不切实际的依赖 2. vector和string条例13vector和string优先于动态分配的数组 条例14使用reserve来避免不必要的重新分配 条例15注意string实现的多样性 条例16了解如何把vector和string数据传给旧的AP1 条例17使用“swap技巧”除去多余的容量 条例18避免使用vector 3. 关联容器条例19理解相等equality和等价equivalence的区别条例20为包含指针类型的关联容器指定比较类型条例21总是让比较函数在等值情况下返回false条例22切勿直接修改set或者multiset中的键条例23考虑用排序的vector代替关联容器条例24当效率至关重要时请在map::operator[]与map::insert之间谨慎做出选择条例25熟悉非标准的散列容器 4. 迭代器条例26iterator优先于const_iterator、reverse_iterator及const_reverse_iterator 在C11中并不使用条例27使用distance和advance将容器的const_iterator转换成iterator条例28正确理解由reverse_iterator的base()成员函数所产生的iterator的用法条例29对于逐个字符的输入请考虑使用istreambuf_iterator 5. 算法条例30确保目标区间足够大 条例31了解各种与排序有关的选择 条例32如果确实要删除元素则需要在remove这一类算法之后调用erase 条例33对包含指针的容器使用remove这一类算法时要特别小心 条例34了解哪些算法要求使用排序的区间作为参数 第35条通过mismatch或lexicographical_compare实现简单的忽略大小写的字符串比较 第36条理解copy_if算法的正确实现 第37条使用accumulate或者for_each进行区间统计 6. 函数子、函数子类、函数及其他第38条遵循按值传递的原则来设计函数子类 第39条确保判别式是“纯函数” 第40条若一个类是仿函数函数对象则应使它可适配 1. 容器 条例01慎重选择容器类型 如何在vector、list、deque中做出选择 vector是默认应使用的序列类型;当需要频繁的在序列中将做插入和删除操作时应使用list。当大多数插入和删除操作发生在序列的头部和尾部时deque是应该考虑的数据结构。 连续内存容器把它的元素存放在一块或者多块内存中每块内存中存多个元素。但有新元素插入或者已有的元素被删除时同一内存块中的其他元素要向前或者向后移动以便为新元素让出空间或者填充被删除元素留下的空隙。这种移动影响到效率和异常安全性。 标准的连续内存容器包括vector、string、deque。 基于节点的容器在每一个内存块中只存放一个元素。容器中元素的插入或者删除只影响到指向节点的指针而不影响节点本身的内容所以当有插入或者删除操作时元素的值不需要移动。 基于节点的容器list、所有标准的关联容器。 对插入和删除操作如果需要事务语义也就是说在插入和删除操作失败时需要回滚的能力你就要使用基于节点的容器。如果对多个元素的插入操作需要事务语义则你需要选择list因为在标准容器中只有list对多个元素的插入操作提供了事务语义。对那些希望编写异常安全代码的程序员事务语义显得尤为重要。 string是STL中在swap过程中会导致迭代器、指针和引用变为无效的唯一容器。 条例02不要试图编写独立于容器类型的代码 STL是以泛化原则为基础的数组被泛化为“以其包含的对象类型为参数”的容器函数被泛化为“以其使用的迭代器的类型为参数”的算法指针被泛化为“以其指向的对象的类型为参数”的迭代器。 很多程序员想以一种不同的方式做泛化。他们在自己的软件中不是针对某种具体的容器而是想把容器的概念泛化这样他们就能使用比如vector而仍保留以后将其换成deque或list的选择——但不必改变使用该容器的代码。这种想法是不正确的 试图编写独立于容器类型的代码——是不正确的 条例03确保容器中对象的拷贝正确而高效 容器中保存了对象但并不是你提供给容器的那些对象。当你通过insert或者push_back向容器中加入对象时存入容器的是你所指定的对象的拷贝。 如果向容器中填充对象而对象的拷贝又非常耗时那么向容器中填充对象这一操作可能成为程序的性能瓶颈。 在继承体系下拷贝动作可能导致剥离slicing。也就是说如果你创建一个存放基类对象的容器却向其中插入派生类对象那么派生类对象被拷贝进容器时它所有的特性部分将被丢失。 剥离问题意味着向基类对象容器中插入派生类对象几乎总是错的。 使拷贝动作高效、正确并防止剥离问题发生的一个简单办法就是使容器包含指针而非对象。 条例04调用empty而不是检查size()是否为空 empty对所有标准容器都是常数时间操作而对于一些list实现size()耗费线性时间。 条例05区间成员函数优先于与之对应的单元素成员函数 给定v1和v2两个向量vector使v1的内容和v2的后半部分相同的最简单操作是什么 v1.assign(v2.begin()v2.size()/2 , v2.end());使用区间成员函数的优点 通过使用区间成员函数通常可以少写一些代码。使用区间成员函数通常可以得到意图清晰或更加直接的代码 当处理标准序列容器时为了取得同样的结果使用单元素的成员函数比使用区间成员函数需要更多地调用内存分配子更频繁地拷贝对象而且/或者做冗余的操作。 条例06当心C编译器最烦人的分析机制 class Widget{...}; Widget w();此处并没有声明一个名为w的Widget类型变量而是声明了一个名为w的函数该函数不带任何参数。 C中的一条普遍规律相符即尽可能地解释为函数声明。 条例07如果容器中包含了通过new操作创建的指针切记在容器对象析构前将指针delete掉 指针容器在自己被析构时会析构掉包含的每一个元素当指针的析构函数什么都不做当然也不会调用delete。 从没有析构函数的类进行共有继承是C中的一项重要禁忌。 STL容器很智能但没有智能到知道是否该删除自己所包含的指针的程度。当你使用指针的容器而其中的指针应该被删除时为了避免资源泄漏你必须或者用引用计数形式的智能指针对象比如Boost的shared_ptr代替指针或者当容器被析构时手工删除其中的每个指针。 条例08切勿创建包含auto_ptr的容器对象 auto_ptr的容器简称COAP是被禁止的。 条例09慎重选择删除元素的方法 对于删除特定元素 对于连续内容容器vector、deque、string——使用erase-remove的方式进行删除元素 c.erase(remove(c.begin(),c.end(), 1963), c.end());对于list直接调用remove()接口进行元素删除。 对于标准关联容器使用erase()接口删除元素。只需要对数时间开销。 关联容器的erase函数是基于等价而不是相等。 对于删除符合条件的元素 对于连续内容容器vector、deque、string——使用erase-remove_if的方式进行删除元素 c.erase(remove_if(c.begin(),c.end(), Func), c.end());对于list直接调用remove_if()接口进行元素删除。 对于标准关联容器有两种方式可以解决问题。 利用remove_copy_if把我们需要的值复制到一个新容器中然后把原来容器的内容和新容器的内容相互交换。for循环中调用容器的erase()接口函数。 for(auto iter c.begin(); iter!c.end();) {if(func(*iter)){c.erase(iter);}else{iter;} }对于标准序列容器使用for进行元素删除时一定要利用erase()函数的返回值。 for(auto iter c.begin(); iter!c.end();) {if(func(*iter)){iter c.erase(iter);}else{iter;} }对于标准序列容器一旦erase完成其返回值指向被删除元素的下一个元素。 条例10了解分配子的限制与约定 条例11理解自定义分配子的合理用法 条例12切勿对STL容器的线程安全性有不切实际的依赖 当涉及STL容器和线程安全性时你可以指望一个STL库允许多个线程同时读一个容器以及多个线程对不同的容器做写入操作。你不能指望STL库会把你从手工同步控制中解脱出来而且你不能依赖于任何线程支持。 2. vector和string 条例13vector和string优先于动态分配的数组 当决定使用new来动态分配内存时将要承担以下责任 确保以后会有人用delete来删除所分配的内存。确保使用了正确的delete形式。确保只delete一次。 当需要动态申请一个数组时应该考虑使用vector或者string来代替。 条例14使用reserve来避免不必要的重新分配 对于vector和string每当需要更多的空间时其操作分为四步 分配一块大小为当前容器的某个倍数的新内存。大多数实现中都已2倍增长。把容器中所有内存都从旧的内存中复制到新的内存中。析构掉旧内存中的对象。释放旧内存。 每当vector或者string扩容之后所有指针、迭代器和引用都会变得无效。 reserve成员函数能使重新分配内存的次数减少到最低限度从而避免了重新分配和指针、迭代器和引用失效带来的开销。 vector和string提供了4个函数 size()显示容器中有多少元素但是不会告诉你该容器申请的内存数量。capacity()当前容器已经分配的内容可以容纳多少个元素。即容器的容量。resize()强迫容器改变到包含n个元素的状态。调用resize()之后size()将返回n。如果n比当前的大小size要小则容器尾部的元素将会被析构。如果n比当前的大小要大则通过默认构造函数创建的新元素将被添加到容器的末尾。如果n比当前的容量要大那么在添加元素之前将先重新分配内存reserve()强迫容器将其容量改为n前提是n不小于当前的大小。如果n比当前的容量小则vector忽略该调用什么也不做而string则可能把自己的容量减为size()和n中的最大值但是string的大小肯定保持不变 通常有两种方式来使用reserve以避免不必要的重新分配 第一种方式是若能确切知道或大致预计容器中最终会有多少元素则此时可使用reserve。在这种情况下就像上面代码中的vector一样你可以简单地预留适当大小的空间。第二种方式是先预留足够大的空间根据你的需要而定然后当把所有数据都加入以后再去除多余的容量。 条例15注意string实现的多样性 string的实现比乍看上去有更多的自由度同样明显的是不同的实现以不同的方式利用了这种设计上的灵活性。这些区别总结如下 string的值可能会被引用计数也可能不会。string对象大小的范围可以是一个char指针的大小的1倍到7倍。创建一个新的字符串值可能需要零次、一次或两次动态分配内存。string对象可能共享也可能不共享其大小和容量信息。string可能支持也可能不支持针对单个对象的分配子。不同的实现对字符内存的最小分配单位有不同的策略。 条例16了解如何把vector和string数据传给旧的AP1 针对vector使用v[0]作为指向第一个元素的指针。从而用来适配C语言接口。但是注意要先判空。 if(not v.empty()) {doSomething(v[0], v.size()); }当你需要一个指向vector中的数据的指针时永远不应该使用begin()。如果为了某种原因决定用v.begin()那么请使用v.begin()因为这和v[0]产生同样的指针。 针对string使用c_str()成员函数返回的结果传递给C语言接口。即便字符串的长度为0这种方式也没问题。 对于vector如果你传递的C API改变了v中元素值的话通常是没有问题的但被调用的函数不能试图改变向量中元素的个数。 条例17使用“swap技巧”除去多余的容量 使用swap方式将vector或者string中去除多余的容量 vectorTv.swap(v);这一技术并不保证一定能除去多余的容量。它意味着“在容器当前的大小确定的情况下使容量在该实现下变为最小”。 swap技巧的一种变化形式可以用来清除一个容器并使其容量变为该实现下的最小值。 vectorT.swap(v);vector的clear()不会改变vector的容量只会清空其中的元素。 在做swap的时候不仅两个容器的内容被交换同时它们的迭代器、指针和引用也将被交换string除外。在swap发生后原先指向某容器中元素的迭代器、指针和引用依然有效并指向同样的元素——但是这些元素已经在另一个容器中了。 条例18避免使用vector 作为一个STL容器vector只有两点不对。首先它不是一个STL容器。其次它并不存储bool。除此以外一切正常。 3. 关联容器 条例19理解相等equality和等价equivalence的区别 STL中不同的函数对于“相同”的定义是不同的。find算法对相同的定义是“相等”是以operator为基础的set::insert()对相同的定义是“等价”是以operator为基础的。 相等的概念是基于operator的。 等价的概念是以“在已排序的区间中对象值的相对顺序”为基础的。 对于两个对象x和y如果按照关联容器c的排列顺序每一个都不在另一个的前面那么称这两个对象按照c的排列顺序有 等价 的值。 使用单一的比较函数并把等价关系作为判定两个元素是否“相同”的依据使得标准关联容器避免了一大堆“若使用两个比较函数将带来的问题”。 条例20为包含指针类型的关联容器指定比较类型 条例21总是让比较函数在等值情况下返回false 对于关联容器判断两个元素是否相同是通过等价来判断的而等价的判断条件是 A不大于B 且 B 不大于A如果比较函数在等值的情况下返回true则会导致等价条件判断错误。从而使关联容器发生错误。 条例22切勿直接修改set或者multiset中的键 set或者multiset中的值不能是const的因为将其定义为const并不合理。 set或者multiset中的键指的是用于判断小于所使用的部分一定不能修改set或者multiset中的键因为这部分心意会影响容器的排序性。 所以试图修改set或multiset中元素的代码将是不可移植的。因为不同厂商是set或者multiset使用的迭代器类型可能不能。 为了使修改set或者multiset中的元素可移植可以使用强制类型转换将迭代器解引用并转换成引用类型。注意此处必须转换成引用类型因为转换成非引用类型会创建新的对象。 条例23考虑用排序的vector代替关联容器 在排序的vector中存储数据可能比在标准关联容器中存储同样的数据要耗费更少的内存而考虑到页面错误的因素通过二分搜索法来查找一个排序的vector可能比查找一个标准关联容器要更快一些。 查找操作几乎从不跟插入和删除操作混在一起”时再考虑使用排序的vector而不是关联容器才是合理的。 所以当使用vector来模仿mapKV时存储在vector中的数据必须是pairKV而不是pairconst KV。 条例24当效率至关重要时请在map::operator[]与map::insert之间谨慎做出选择 map::operator[]的设计目的是为了提供“添加和更新”add or update的功能。 具体的工作方式是这样的operator[] 返回一个引用它指向与k相关联的值对象。然后v被赋给该引用operator[]返回的那个引用所指向的对象。 当向映射表中添加元素时要优先选用insert而不是operator[] 当更新已经在映射表中的元素的值时要优先选择operator[]。 条例25熟悉非标准的散列容器 4. 迭代器 条例26iterator优先于const_iterator、reverse_iterator及const_reverse_iterator 在C11中并不使用 对容器类container而言iterator类型的功效相当于T而const_iterator则相当于const T。 reverse_iterator与const_reverse_iterator同样分别对应于T和const T所不同的是对这两个迭代器进行递增的效果是由容器的尾部反向遍历到容器头部。 C98中容器的insert()和erase()的参数类型都是iterator类型但是C11中insert()和erase()的参数类型全都改成了const_iterator类型。 条例27使用distance和advance将容器的const_iterator转换成iterator 对于这些容器类型iterator和const_iterator是完全不同的类。试图将一种类型转换为另一种类型是毫无意义的这就是const_cast转换被拒绝的原因。 条例28正确理解由reverse_iterator的base()成员函数所产生的iterator的用法 通过base()函数可以得到一个与reverse_iterator“相对应的”iterator的说法并不准确。reverse_interator::base得到的iterator指向的元素是reverse_interator指向元素的下一个元素。 条例29对于逐个字符的输入请考虑使用istreambuf_iterator 5. 算法 条例30确保目标区间足够大 无论何时如果所使用的算法需要指定一个目标区间那么必须确保目标区间足够大或者确保它会随着算法的运行而增大。 要在算法执行过程中增大目标区间请使用插入型迭代器比如ostream_iterator或者由back_inserter、front_inserter和inserter返回的迭代器。 条例31了解各种与排序有关的选择 如果需要对vector、string、deque或者数组中的元素执行一次完全排序那么可以使用sort或者stable_sort。 如果有一个vector、string、deque或者数组并且只需要对等价性最前面的n个元素进行排序那么可以使用partial_sort。 如果有一个vector、string、deque或者数组并且需要找到第n个位置上的元素或者需要找到等价性最前面的n个元素但又不必对这n个元素进行排序那么nth_element正是你所需要的函数。 如果需要将一个标准序列容器中的元素按照是否满足某个特定的条件区分开来那么partition和stable_partition可能正是你所需要的。 如果你的数据在一个list中那么你仍然可以直接调用partition和stable_partition算法可以用list::sort来替代sort和stable_sort算法。但是如果你需要获得partial_sort或nth_element算法的效果那么你可以有一些间接的途径来完成这项任务。 条例32如果确实要删除元素则需要在remove这一类算法之后调用erase 因为从容器中删除元素的唯一方法是调用该容器的成员函数而remove并不知道它操作的元素所在的容器所以remove不可能从容器中删除元素。 用remove从容器中删除元素而容器中的元素数目却不会因此而减少。 remove不是真正意义上的删除因为它做不到。 remove移动了区间中的元素其结果是“不用被删除”的元素移到了区间的前部保持原来的相对顺序。它返回的一个迭代器指向最后一个“不用被删除”的元素之后的元素。这个返回值相当于该区间“新的逻辑结尾”。 如果你真想删除元素那就必须在remove之后使用erase。 vectorint vv.erase(remove(v.begin(),v.end(),2) , v.end());对于list可以直接调用其remove成员函数。 条例33对包含指针的容器使用remove这一类算法时要特别小心 但容器中存储指针时在调用remove时就可能造成内存泄漏。 如果容器中存放的不是普通指针而是具有引用计数功能的智能指针那么与remove相关的困难就不再存在了。 条例34了解哪些算法要求使用排序的区间作为参数 有些算法要求排序的区间即区间中的值是排过序的。当使用这些算法的时候遵循这条规则尤为重要因为违反这一规则并不会导致编译器错误而会导致运行时的未确定行为。 第35条通过mismatch或lexicographical_compare实现简单的忽略大小写的字符串比较 第36条理解copy_if算法的正确实现 目前stl支持copy_if 第37条使用accumulate或者for_each进行区间统计 使用accumulate统计容器中所有字符串的长度。 6. 函数子、函数子类、函数及其他 第38条遵循按值传递的原则来设计函数子类 由于函数对象往往会按值传递和返回所以你必须确保你编写的函数对象在经过了传递之后还能正常工作。这意味着两件事首先你的函数对象必须尽可能地小否则复制的开销会非常昂贵其次函数对象必须是单态的不是多态的也就是说它们不得使用虚函数。 第39条确保判别式是“纯函数” 一个判别式predicate是一个返回值为bool类型或者可以隐式地转换为bool类型的函数。 一个纯函数pure function是指返回值仅仅依赖于其参数的函数。 在C中纯函数所能访问的数据应该仅局限于参数及常量在函数生命期内不会被改变自然地这样的常量数据应该被声明为const。如果一个纯函数需要访问那些可能会在两次调用之间发生变化的数据那么用相同的参数在不同的时刻调用该函数就有可能会得到不同的结果这将与纯函数的定义相矛盾。 第40条若一个类是仿函数函数对象则应使它可适配
http://www.w-s-a.com/news/869219/

相关文章:

  • 企业网站首页学生做的网站成品
  • 网站开发 架构设计企业信息管理系统的组成不包括
  • 网站维护模式网页传奇游戏平台排行
  • 企业网站改自适应蛋糕方案网站建设
  • 网站开发技术职责网站升级中html
  • 天网网站建设百度权重高的网站
  • 明年做哪些网站致富网站站长 感受
  • 东莞营销网站建设优化怎么做微信网站推广
  • 网站建设一个多少钱php网站服务器怎么来
  • 引流用的电影网站怎么做2012服务器如何做网站
  • 什么网站可以做推广广州安全信息教育平台
  • 网站开发具备的相关知识wordpress简约文字主题
  • asp网站伪静态文件下载seo外包公司哪家好
  • 淘宝客网站根目录怎么建个废品网站
  • 网站备案更改需要多久百度免费网站空间
  • 外发加工是否有专门的网站wordpress主页 摘要
  • 企业网站优化系统浙江建设信息港证书查询
  • 很多年前的51网站如何做跨境电商需要哪些条件
  • 网站建设中 请稍后访问互联网营销设计
  • 软文网站名称用户浏览网站的方式
  • 大兴模版网站搭建哪家好网站建设与管理管理课程
  • 四川成都网站制作微信广告平台推广
  • 网站价格网页制作网站开发实训步骤
  • cms 导航网站鹤壁做网站价格
  • 微信营销软件免费版郑州关键词优化费用
  • 邢台专业做网站哪家好临沂网站建设中企动力
  • 建设网站是主营成本吗wordpress 后台
  • 猎头可以做单的网站企业网站建设
  • 建小程序需要网站吗在putty上怎样安装wordpress
  • 天津智能网站建设找哪家WordPress相册插件pro