条目四《用empty来代替检查size()是否为0》

首先先说结论:

  • empty()实现为内联函数。(众所周知, 优秀的内联函数的效率比一般函数是高的)
  • 在stl标准库中,empty()对所有容易的时间复杂度是常数时间, 而对于一些list实现,size()是线性时间的。

基于以上两点, 在实际使用中, 需要判断容易的元素是否为0时,最好的选择是使用empty()函数。

造成size()在list容器的特殊性是由于list中splice()的存在。

在实现list时,有两点是需要注意的:

  • 1.为了高效,让list知道自己的size是多大,即把size()做成时间复杂度是常数级别(每向list插入元素就往size()返回的变量自增1)
  • 2.选用list, 就是因为list的特殊性,两个list拼接的时间复杂度只是常数级别的。所以把splice()做成时间复杂度是常数级别。
以上两点可以并存吗?

很抱歉,不能并存。

为了让** size()常数级别 ,就是在调用splice()后调用size()的时间复杂度是常数级别,必须在splice后马上 遍历 **被splice的list的元素更新新list的size,这样后面再使用size()就是常数时间,因为list已经知道自己的size了。

但是这样做,区间splice()就不是常数时间了,而是线性时间。

为了让** splice()常数级别 ,那么在splice时就应该忽略size的更新,抛弃更新被拼接list的size()成员函数。等到在调用size()的时候再 遍历 **list来获得list的size。

但是这样做, size()就不是常数时间了,而是线性时间。

究其原因是区间splice()在底层实现不是一个一个插入元素的,而是根据迭代器的始末,来一次拷贝元素达到目的,所以才有条目五

所以在list中,size()和区间splice()不能同时是常数时间,在实际实现时要看我们比较倾向哪一个,如果基本不适用区间splice,那么可以把size实现为是常数时间的。

这一切,关键看需求......

条目四《用empty来代替检查size()是否为0》的更多相关文章

  1. 【S4】使用empty()而不是判断size()是否为0

    1.二者的作用是一样的,结果也是等价的.就是判断集合是否为空. 2.二者是等价的,为什么强调使用empty,因为empty效率更高. 3.在STL中,对于一般的集合,empty和size都是常数时间. ...

  2. Effective STL 阅读笔记: Item 4 ~ 5: Call empty instead of checking size() against zero.

    Table of Contents 1 Item 4: Call empty instead of checking size() against zero 2 Item 5: Prefer rang ...

  3. IAR 编译错解决Error[e16]: Segment NEAR_Z (size: 0x16d align: 0) is too long for segment definition. At least 0x83 more bytes needed.

    Error[e16]: Segment NEAR_Z (size: 0x16d align: 0) is too long for segment definition. At least 0x83 ...

  4. IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition.

    IAR 9+ 编译 TI CC2541 出现 Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. Segm ...

  5. IAR编译错误Error[e16]: Segment ISTACK (size: 0xc0 align: 0) is too long for segment definition. At least 0x8 more bytes needed. The problem occurred while processing the segment

    问题:个人使用的是IARV9.10编译CC2541的工程,没有做任何修改,直接编译出现如下错误 Error[e16]: Segment ISTACK (size: 0xc0 align: 0) is ...

  6. 四种java代码静态检查工具

    [转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043       1月16日厦门 OSC ...

  7. Solr.NET快速入门(四)【相似查询,拼写检查】

    相似查询 此功能会返回原始查询结果中返回的每个文档的类似文档列表. 参数通过QueryOptions的MoreLikeThis属性定义. 示例:搜索"apache",为结果中的每个 ...

  8. 根据判断数组不为空然后取他的值----数组不会为空---只能判断其size是否大于0

    private List<Integer> classId=new ArrayList<Integer>(); business.getClassId()!=null 以上为错 ...

  9. 第四课,T语言运算符(版本5.0)

    TC综合开发工具里支持了丰富的运算符,这样也要求大家对运算符的知识必须了解清楚,否则出现错误还不知道问题所在下面就为大家说说运算符的优先级与各个运算符含义 注意: 优先级代表同一表达式中运算符的运算顺 ...

随机推荐

  1. KinderEditor编辑器 在Asp.Net中的使用

    KinderEditor编辑器的使用 分为简单的三步. 1:添加引用部分 <script src="/KinderEditor/kindeditor-min.js">& ...

  2. Codeforce 1004C

    Description Since Sonya is interested in robotics too, she decided to construct robots that will rea ...

  3. JDK和CGLIB生成动态代理类的区别(转)

     关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...

  4. JAVA基础知识总结16(IO流)

    IO流:用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不同,分为字节 ...

  5. 设置窗口的z-order总是在最底部

    想让窗口置顶,很简单,只需要在SetWindowPos中指定 HWND_TOPMOST就OK了, 但是如果想要窗口始终位于最底端,Windows却没有提供接口. 不过呢,Windows提供了一个消息W ...

  6. C++获取时间并命名为文件名

    #include <time.h> char pStrPath1[20];time_t currTime;struct tm *mt;Mat saveImg1; currTime = ti ...

  7. 61-结点选择(树形dp)

     http://lx.lanqiao.cn/problem.page?gpid=T14 算法训练 结点选择   时间限制:1.0s   内存限制:256.0MB        问题描述 有一棵 n 个 ...

  8. 性能优化之_android多线程

    本文大纲为: 如何创建线程 线程间如何通讯 线程间如何安全的共享信息 一.线程的创建 Thread在run方法中执行具体事务,或者传入一个runnable对象,但是不能调用view控件的更新方法,但是 ...

  9. PC建立WIFI热点

    netsh wlan set hostednetwork ssid=test key =12345678netsh wlan start hostednetwork

  10. Java基础语法(二)<运算符>

    运算符: 下面的都是相关的练习: 1.键盘录入一个三位整数数,请分别获取该三位数上每一位的数值 import java.util.Scanner; public class Test02 { publ ...