[转载] C++ STL中判断list为空,size()==0和empty()有什么区别
关于两个的区别,首先size()==0为bool表达式,empty()为函数调用,这一点很明显。查看源代码,
bool empty() const { return _M_node->_M_next == _M_node; } size_type size() const {
size_type __result = ;
distance(begin(), end(), __result);
return __result;
}
可以看出empty直接检查标记节点,而size是通过求首尾迭代器的距离来获取元素个数的。
查看的源代码来自http://www.sgi.com/tech/stl/download.html
Effective STL中文版:50条有效使用STL的经验
对任一容器c ,下面的代码
if (c.size() == 0)…
本质上与
if (c.empty())…
是等价的。既然如此,你或许会疑惑为什么要偏向于某一种形式,尤其是考虑到empty 通常被
实现为内联函数(inline function ),并且它所做的仅仅是返回 size 是否为0。
你应该使用empty 形式,理由很简单:empty 对所有的标准容器都是常数时间操作,而对一些list 实现,size 耗费线性时间。
到底是什么使list 这么讨厌呢?为什么它不也提供常数时间的size 呢?答案在于list 所独有的链接(splice)操作。考虑如下代码:
list<int> list1;
list<int> list2;
…
list1.splice( //把list2中从第一个含5 的节点
list1.end(), list2, //到最后一个含10的所有节点
find(list2.begin(), list2.end(), 5), //移动到list1的末尾
find(list2.rbegin(), list2.rend(), 10).base()
//关于base() 调用的信息,见第28条
);
这段代码只有当list2 中在含5
的节点之后有含10的节点时才工作。假定这不是一个问题,而把注意力集中在下面这个问题上:链接后的list1
中有多少个元素?很明显,链接后的list1 中的元素个数是它链接前的元素个数加上链接过来的元素个数。但有多少个元素被链接过来了
呢?应该与find(list2.begin(), list2.end(), 5)和find(list2.rbegin(),
list2.rend(), 10). base()
所定义的区间中的元素个数一样多。好,那究竟是多少个呢?如果不遍历该区间来数一数,你是没法知道的。问题就在这里。
假定由你来负责实现list。list 不仅是容器,而且是标准容器,它将会被广泛使用。你自然会希望自己的实现尽量高效。你发现用户通常希望知道
list 中有多少个元素,所以你想使 size 成为常数时间操作。因此,你希望设计list,使它总知道自己含有多少个元素。
同时,你知道在所有的标准容器中,只有list 具有把元素从一处链接到另一处而不需要拷贝任何数据的能力。你推断,许多 list
的客户之所以选择它,是因为它提供了高效的链接操作。他们知道把一个区间从一个list 链接到另一个list
可以通过常数时间来完成。你很清楚他们知道这一点,所以你当然想满足他们的期望,使splice成为常数时间的成员函数。
这将使你左右为难。如果 size 是常数时间操作,那么 list 的每个成员函数都必须更新它们所操作的链表的大小(size ),当然也包括
splice。可是 splice更新它所改变的链表的大小的唯一方式是计算所链接的元素的个数,而这会使
splice不具有你所希望的常数时间操作性能。如果你不要求splice更新它所改变的链表的大小,则splice可以成为常数时间操作,可是这时size
会成为线性时间操作。通常,它需要遍历自己的整个数据结构来看一看自己含有多少个元素。不管你怎么看,某些方面——list
或splice——必须做出让步。其中的一个可以成为常数时间操作,但不可能二者都是。
不同的链表实现通过不同的方式解决这一冲突,具体方式取决于作者选择把 size 还是splice实现得最为高效。如果你使用的list
实现恰好是把splice的常数时间操作放在第一位的,那么你使用empty 而不是size 会更好些,因为empty
操作总是花费常数时间。即使现在你使用的list
实现不是这种方式,将来你也可能会发现自己在使用这样的实现。比如,你可能把自己的代码移植到不同的平台上,该平台上的 STL
采用了不同的实现;又如,你可能决定切换到当前平台上的不同的STL 实现。
不管发生了什么,调用empty 而不是检查size==0 是否成立总是没错的。所以,如果你想知道容器中是否含有零个元素,请调用empty。
[转载] C++ STL中判断list为空,size()==0和empty()有什么区别的更多相关文章
- (转)Java 中关于String的空对象(null) ,空值(empty),空格
原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例 ...
- PHP中判断变量为空的几种方法
判断变量为空,在许多场合都会用到,同时自己和许多新手一样也经常会犯一些错误, 所以自己整理了一下PHP中一些常用的.判断变量为空的方法. 1. isset功能:判断变量是否被初始化本函数用来测试变量是 ...
- c#中判断对象为空的几种方式(字符串等)
(1)先了解几个与空类型相关的关键字和对象 Null : 关键字表示不引用任何对象的空引用,它是所有引用类型变量的默认值,在2.0版本之前也就只有引用变量类型可以为null,如(string a=n ...
- mysql中判断字段为空
mysql中判断字段为null或者不为null 在mysql中,查询某字段为空时,切记不可用 = null, 而是 is null,不为空则是 is not null select nulco ...
- (转载) STL中map用法详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...
- Java中判断是否为空的方法
1.判断字符串或者对象是否为空 首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.ut ...
- PHP中判断变量为空的几种方法小结
isset 主要用来判断变量是否被初始化过empty 可以将值为 "假"."空"."0"."NULL"." ...
- (转载)java中判断字符串是否为数字的方法的几种方法
java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < ...
- shell中判断一个变量是否为0或者为某个具体的值
需求说明: 在实际写脚本的过程中,需要判断某个变量的值是否为某个数字, 比如,判断某个进程的数量是否为0用来确定进程是否存在,这样的情况. 简单来说,算术比较. 测试过程: 通过以下的脚本来判断mys ...
随机推荐
- CentOS6.X、7.X下Jenkins的安装及使用
一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenk ...
- WebAPI使用Token进行验证
1.需要用到的包 可以先敲代码 发现没有包在添加 2.在项目根目录下Web层添加“Startup”类 这个是Token的配置 3.在WebAPI层添加WebApiConfig类 也是Tok ...
- DAY1 计算机组成和操作系统
一.编程与编程目的 1.编程语言的定义 编程语言是人与计算机之间沟通的介质 2.什么是编程 编程就是程序员通过编程语言让计算机实现所想做的事 3.编程的目的 解放人力,让计算机按照人的逻辑思维进行工作 ...
- ajax和iframe区别
ajax和iframe https://segmentfault.com/a/1190000011967786 ajax和iframe的区别 1.都是局部刷新 2.iframe是同步的,而ajax是异 ...
- C#清除HTML样式
C#清除HTML样式 需求说明: 网站开发时我们经常用一个富文本控件让用户自己编辑新闻内容和新闻格式,然后将HTML代码一并保存到数据库中. 然后显示文章列表的时候只需要显示一个文章摘要,所以我们就计 ...
- (转).Net中自定义类作为Dictionary的key详解
在定义数据结构时,Dictionary提供了快速查找数据的功能,另外Dictionary< TKey, TValue >属于key-value键值对数据结构,提供了泛型的灵活性,是数据结构 ...
- Java Config for WebProject
1.Java EE vs Java SE They are just official SDK,when using IDE,it's ok to just install jdk/jre. &quo ...
- 中标麒麟Linux7 如何关闭广播消息
chmod 600 /usr/libexec/sysnotify pkill -9 sysnotify
- JSON和Serialize数据格式的对比
1.相同点: 都是把其它数据类型转换为可传输的字符串 都是结构性数据 2.不同点: JSON比Serialize序列后的格式要简洁 Serialize序列化的数据格式保存数据原有类型 3.扩展 JSO ...
- 最简单的网络图片的爬取 --Pyhon网络爬虫与信息获取
1.本次要爬取的图片的url http://www.nxl123.cn/static/imgs/php.jpg 2.代码部分 import requestsimport osurl = "h ...