条目四《用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. ffmpeg个人翻译文档1-8<转>

    [个人翻译]ffmpeg文档1 (2008-08-26 09:39:15) 转载 标签: 杂谈 分类: 翻译文档 指导1:制作屏幕录像 源代码:tutorial01.c 概要   电影文件有很多基本的 ...

  2. EditText中onEditorAction监听事件执行两次

    Android的EditText通过setOnEditorActionListener给文本编辑框设置监听事件,但是在其处理方法onEditorAction中的逻辑在每次回车后都触发了两次, 原来是在 ...

  3. C#操作SQLIte数据。

    using System; using System.Data; using System.Text.RegularExpressions; using System.Xml; using Syste ...

  4. 【279】◀▶ Python 运算符说明

    参考:Python 运算符说明 目录: 一.算术运算符 二.比较(关系)运算符 三.赋值运算符 四.位运算符 五.逻辑运算符 六.成员运算符 七.身份运算符 八.运算符优先级 一.Python 算术运 ...

  5. java基础之io流总结三:字节流读写

    字节流读写适用于任何文件,包括图片,视频等. 基本字节流 一次读一个字节和一次读一个字节数组 FileInputStream fis = new FileInputStream(path); //一次 ...

  6. java基础之io流总结一:io流概述

    IO流概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.io流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. IO流的分类: 根据处理数据类型的不同分为:字符流 ...

  7. 使用Maven构建多模块企业项目

    首先,前面几次学习已经学会了安装maven,如何创建maven项目等,最近的学习,终于有点进展了,搭建一下企业级多模块项目. 好了,废话不多说,具体如下: 首先新建一个maven项目,pom.xml的 ...

  8. Linux mii-tool命令

    一.简介 mii-tool 是一个用来查看,管理介质的网络接口的状态的工具. 二.选项 usage: mii-tool [-VvRrwl] [-A media,... | -F media] [int ...

  9. Django--form验证及错误处理

    需求 from表单验证和ajax验证时返回的错误信息处理 速查 1.form表单提交时错误信息显示 views 1 2 error = form表单实例化对象.errors return render ...

  10. Linux系统获取CPU温度

    Linux系统获取CPU温度 摘自:https://jingyan.baidu.com/article/cbf0e500407d072eab289343.html 各位好,本篇将简单介绍如何在不同系列 ...