随笔分类 -  C/C++

摘要:众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法。本文完整源码:点此查看 首先,要明白使用正向迭代器(iterator)进行反向遍历是错误的用法,要不干嘛要有反向迭代器呢(reverse_iterator)。其次,根据容器的特性,遍历删除操作的用法可以分为两组,第一组是 list 和 vector,第二组是 map 和 set。 阅读全文
posted @ 2014-04-22 09:31 飘飘白云 阅读(3261) 评论(1) 推荐(0) 编辑
摘要:让gcc支持成员函数模板的trick 同样的代码在 VS2010 中编译运行是没有问题的,但在 gcc 4.7.3下,编译都通不过: ../src/MemFunTemplate.h:21:14: error: explicit specialization in non-namespace scope ‘struct Functor’ ../src/MemFunTemplate.h:22:24: error: template-id ‘function’ in declaration of primary template ../src/MemFunTemplate.h:26:14: error: explicit specialization in non-namespace scope ‘struct Functor’ ../src/MemFunTemplate.h:26:38: error: template-id ‘function’ in declaration of primary template ../src/MemFunTempla 阅读全文
posted @ 2013-07-12 21:59 飘飘白云 阅读(1954) 评论(0) 推荐(1) 编辑
摘要:在前一篇《[深入理解C++(一)]类型转换(Type Casting)》中,我详细讲述了 C++ 中转型动作,以及使用规则。有网友说应该提及下《深度探索 C++ 对象模型》一书中的内容,其实他的意思是,要是对 C++ 对象的内存布局不甚了解,就想要彻悟C++中的类型转型,对象切割,虚函数调用等,犹如脱离了坚实的根基,想去建空中阁楼。理解 C++ 对象的内存布局对学会 C++来说至关重要,但我不打算写 C++ 对象的内存布局相关的文章,因为要站在前人的肩膀上,大牛陈皓 已经就这个主题写了三篇图文并茂的文章: (一),C++ 虚函数表解析 (二),C++ 对象的内存布局(上) (三),C++ 对象的内存布局(下) 在继续阅读本文之前,建议先阅读这三篇文章,以更好地理解本系列文章。在接下来的内容中,我将从重载,重写,屏蔽等概念入手,引入众多接口继承规则。 阅读全文
posted @ 2012-11-06 21:50 飘飘白云 阅读(2266) 评论(2) 推荐(1) 编辑
摘要:类型转换就是将给定类型的表达式转换为另一种类型。C++中的转型可分为两种:隐式类型转换和显式类型转换。下面将详细介绍这两种转型操作,以及各自的适用场景,潜在问题,最终将总结使用类型转换操作应牢记的原则。 阅读全文
posted @ 2012-10-28 21:54 飘飘白云 阅读(2452) 评论(1) 推荐(2) 编辑
摘要:当 timeout = 0, 即 Sleep(0),如果线程调度器的可运行队列中有大于或等于当前线程优先级的就绪线程存在,操作系统会将当前线程从处理器上移除,调度其他优先级高的就绪线程运行;如果可运行队列中的没有就绪线程或所有就绪线程的优先级均低于当前线程优先级,那么当前线程会继续执行,就像没有调用 Sleep(0)一样。 当 timeout > 0 时,如:Sleep(1),会引发线程上下文切换:调用线程会从线程调度器的可运行队列中被移除一段时间,这个时间段约等于 timeout 所指定的时间长度。为什么说约等于呢?是因为睡眠时间单位为毫秒,这与系统的时间精度有关。通常情况下,系统的时间精度为 10 ms,那么指定任意少于 10 ms但大于 0 ms 的睡眠时间,均会向上求值为 10 ms。 阅读全文
posted @ 2012-10-11 20:08 飘飘白云 阅读(9369) 评论(8) 推荐(1) 编辑
摘要:长久以来,C++一直突出于优秀的技巧和典范。老有名气的一个就是James Coplien在1995年提出的奇异递归模板模式(CRTP)。自那以后,CRTP便开始流行并在多个库中使用,尤其是Boost。例如,你可以在Boost.Iterator,Boost.Python或者Boost.Serialization库中看到他们。 在这篇文章中,我假设读者已经熟悉了CRTP。如果你想温习一下的话,我推荐你去阅读《C++模板编程》的第17章。在www.informit.com上,你可以找到该章节的免费版本。 如果你抱着OO的观点去看CRTP的话,你会发现,他和OO框架的有着共同的特点,都是基类调用虚函数, 真正的实现在派生类中。下面是一个最简单的OO框架实现代码: 阅读全文
posted @ 2010-03-25 11:26 飘飘白云 阅读(1336) 评论(0) 推荐(1) 编辑
摘要:这一系列文章介绍Microsoft Visual Studio 2010 中支持的C++ 0x特性,目前有三部分。 Part 1 :介绍了Lambdas, 赋予新意义的auto,以及 static_assert; Part 2( 1 , 2 ):介绍了右值引用(Rvalue References); Part 3 :介绍了表达式类型(decltype) VC10中的C++0x特性 Part 1,2,3 译文打包下载(doc 和 pdf 格式): 点此下载 本文是Part 3。 今天我要讲 decltype ,它让完美转发函数能够返回任意类型的东西。 对编写高度泛型的人来说这是很有趣的的特性。 阅读全文
posted @ 2009-06-05 16:59 飘飘白云 阅读(326) 评论(0) 推荐(0) 编辑
摘要:这一系列文章介绍Microsoft Visual Studio 2010 中支持的C++ 0x特性,目前有三部分。 Part 1 :介绍了Lambdas, 赋予新意义的auto,以及 static_assert; Part 2( 1 , 2 ):介绍了右值引用(Rvalue References); Part 3 :介绍了表达式类型(decltype) VC10中的C++0x特性 Part 1,2,3 译文打包下载(doc 和 pdf 格式): 点此下载 本文是 Part 2 的第二页。 move 语意:从 lvalue 移动 阅读全文
posted @ 2009-06-03 17:50 飘飘白云 阅读(516) 评论(0) 推荐(0) 编辑
摘要:这一系列文章介绍Microsoft Visual Studio 2010 中支持的C++ 0x特性,目前有三部分。 Part 1 :介绍了Lambdas, 赋予新意义的auto,以及 static_assert; Part 2( 1 , 2 ):介绍了右值引用(Rvalue References); Part 3 :介绍了表达式类型(decltype) VC10中的C++0x特性 Part 1,2,3 译文打包下载(doc 和 pdf 格式): 点此下载 本文是 Part 2 的第一页。 今天我要讲的是 rvalue references (右值引用),它能实现两件不同的事情: move 语意和完美转发。刚开始会觉得它们难以理解,因为需要区分 lvalues 和 rvalues ,而只有极少数 C++98/03 程序员对此非常熟悉。这篇文章会很长,因为我打算极其详尽地解释 rvalue references 的运作机制。 不用害怕,使用 ravlue references 是很容易的,比听起来要容易得多。要在你的代码中实现 move semantic 阅读全文
posted @ 2009-06-01 20:43 飘飘白云 阅读(462) 评论(0) 推荐(0) 编辑
摘要:这一系列文章介绍Microsoft Visual Studio 2010 中支持的C++ 0x特性,目前有三部分。 Part 1 :介绍了Lambdas, 赋予新意义的auto,以及 static_assert; Part 2( 1 , 2 ):介绍了右值引用(Rvalue References); Part 3 :介绍了表达式类型(decltype) 阅读全文
posted @ 2009-05-28 12:11 飘飘白云 阅读(544) 评论(0) 推荐(0) 编辑

本博客遵循 Creative Commons License “署名-非商业用途-保持一致”创作共用协议。 与我联系