C++
文章平均质量分 67
dwx2046
这个作者很懒,什么都没留下…
展开
-
STL源码剖析——Traits编程技术
http://blog.csdn.net/chenhanzhun/article/details/39230529前言 在STL编程中,容器和算法是独立设计的,即数据结构和算法是独立设计的,连接容器和算法的桥梁就是迭代器了,迭代器使其独立设计成为可能。Traits编程技术是STL中最重要的编程技术,Traits可以获取一个类型的相关信息。在学习《STL源码剖析》时,看到关转载 2016-03-18 14:28:16 · 317 阅读 · 0 评论 -
ios_base::sync_with_stdio() 的具体用法
http://bbs.csdn.net/topics/280019504http://tieba.baidu.com/p/2643059585决定C++标准streams(cin,cout,cerr...)是否与相应的C标准程序库文件(stdin,stdout,stderr)同步,也就是是否使用相同的stream缓冲区,缺省情况是同步的,但由于同步会带来某些不必要的负担,因此该函数转载 2016-03-27 22:16:16 · 5002 阅读 · 0 评论 -
辗转相除法求最大公约数
辗转相除法的格式例如,求(319,377):∵ 319÷377=0(余319)∴(319,377)=(377,319);∵ 377÷319=1(余58)∴(377,319)=(319,58);∵ 319÷58=5(余29),∴ (319,58)=(58,29);∵ 58÷29=2(余0),∴ (58,29)= 29;∴ (319,377)=29.可以写成原创 2016-03-27 22:38:32 · 1322 阅读 · 0 评论 -
《Effective STL》学习笔记(第一部分)
本书从STL应用出发,介绍了在项目中应该怎样正确高效的使用STL。本书共有7个小节50个条款,分别为(1) 容器:占12个条款,主要介绍了所有容器的共同指导法则(2) vector和string:占6个条款,介绍了最常用的两种容器的一些使用经验(3) 关联容器:占7个条款,介绍了关联容器(*map,*set)的使用经验(4) 迭代器:占12个条款,介绍了迭代转载 2016-04-09 19:59:29 · 371 阅读 · 0 评论 -
《Effective STL》学习笔记(第二部分)
http://dongxicheng.org/cpp/effective-stl-part2/2、 vector和string所 有的STL容器都很有用,但是相比于其他容器,vector和string更常用。本章从多个角度覆盖vector和string,如:为什么提倡使用 vector代替数组,怎样改进vector和string的性能?怎样除去过剩的内存,vector是个什转载 2016-04-09 21:29:43 · 353 阅读 · 0 评论 -
《Effective STL》学习笔记(第三部分)
4、 迭代器标准STL容器提供了四种不同的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator为什么有四种迭代器?它们之间的关系是什么?它们可以互相转化吗?在调用算法和STL实用函数时不同类型可以混合使用吗?这些类型是怎么关联到容器和它们的成员函数的?本章回答了这些问题,同时介绍了一个比通常更值得注意转载 2016-04-09 21:30:48 · 366 阅读 · 0 评论 -
《Effective STL》学习笔记(第四部分)
http://dongxicheng.org/cpp/effective-stl-part4/6、仿函数、仿函数类、函数等函数和类似函数的对象——仿函数——遍布STL。关联容器使用它们来使元素保持有 序;find_if使用它们来控制它们的行为;如果缺少它们,那么比如for_each和transform这样的组件就没有意义了;此外,not1和 bind2nd这样的适配器会积极地产转载 2016-04-09 21:32:50 · 431 阅读 · 0 评论 -
记录一次多线程死锁的问题
std::mutex mtx;std::condition_variable cv;int cargo = 0; // shared value by producers and consumersvoid consumer(){ std::unique_lock lck(mtx); while (cargo == 0) cv.wait(lck);原创 2016-04-29 10:04:01 · 528 阅读 · 0 评论 -
C++中的placement new
什么是placement new?所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。placement new的好处:1)在已分配好的内存上进行对象的构建,构建速度快。2)已分配好的内存可以反复利用,有效的避免内存碎片问题。首先我们区分下几个容易混淆的关键词:new、opera原创 2016-05-06 22:05:16 · 760 阅读 · 0 评论 -
关于外部模板的理解
在标准C++中,只要在编译单元内遇到被完整定义的模板,编译器都必须将其实例化(instantiate)。这会大大增加编译时间,特别是模板在许多编译单元内使用相同的参数实例化。看下面的例子://function.htemplate void fun(T t){}//test1.cppvoid test1(){ fun(1);}//test2.cppvoid test2(){原创 2016-04-22 21:34:07 · 878 阅读 · 0 评论 -
返回一个临时变量的右值引用,那么临时对象什么时候释放?
最近在研究右值引用的时候碰到这个问题,还没有解决,将问题贴在这里,待更新:const int* printAddress(const int & v){ cout << v << endl; cout (&v) << endl; return (&v);}int getInt(int x){ printAddress(x); return x;原创 2016-04-23 13:23:07 · 5281 阅读 · 1 评论 -
从4行代码看右值引用
这篇文章是目前为止讲解右值引用,move语义以及完美转发最完整最通俗的,原文在此:http://www.cnblogs.com/qicosmos/p/4283455.html从4行代码看右值引用概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int&转载 2016-04-24 11:59:24 · 398 阅读 · 0 评论 -
C++内存模型
关于乱序说到内存模型,首先需要明确一个普遍存在,但却未必人人都注意到的事实:程序通常并不是总按着照源码中的顺序一一执行,此谓之乱序,乱序产生的原因可能有好几种:编译器出于优化的目的,在编译阶段将源码的顺序进行交换。程序执行期间,指令流水被 cpu 乱序执行。inherent cache 的分层及刷新策略使得有时候某些写读操作的从效果上看,顺序被重排。以上乱序现象虽然来源不同原创 2016-07-07 11:11:35 · 1105 阅读 · 0 评论 -
C++traits技术的理解
traits是c++中的自动类型推断,可以用来获得一个类型的相关信息。比如我们有一个泛型的迭代器类,其中T为所指向的类型。template class myIterator{ ...};当我们使用myIterator时,怎样才能获知它所指向的元素的类型呢?我们可以为这个类加入一个内嵌类型,像这样:template class myIterator{ typedef转载 2016-07-07 22:17:27 · 3444 阅读 · 1 评论 -
C++volatile详解
1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明:A volatile specifier is a hint to a compiler that a原创 2016-07-08 10:44:46 · 1820 阅读 · 0 评论 -
C/C++语言字符串操作总结大全(超详细)
字符串操作strcpy(p, p1) 复制字符串strncpy(p, p1, n) 复制指定长度字符串strcat(p, p1) 附加字符串strncat(p, p1, n) 附加指定长度字符串strlen(p) 取字符串长度strcmp(p, p1) 比较字符串strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符原创 2016-08-13 11:32:24 · 853 阅读 · 0 评论 -
stat,fstat以及lstat函数
stat,fstat以及lstat函数 本章的讨论的中心是三个stat函数以及它们所返回的信息。 #include int stat(const char*pathname,struct stat*buf); int fstat(int filedes,struct stat*buf); int lstat原创 2016-03-23 16:23:22 · 613 阅读 · 0 评论 -
char * 与 string 类型相互转换方法--Linux C/C++
http://blog.csdn.net/harry_lyc/article/details/60101671:对于C风格的字符串比如char*,char str[],转换为 string char * 和char str[]类型可以直接转换为string 类型; 即,在char * chstr,转载 2016-03-25 18:18:15 · 6970 阅读 · 0 评论 -
vector.resize 与 vector.reserve的区别
http://www.cnblogs.com/kex1n/archive/2012/05/22/2512789.htmlstd::vector的reserve和resize的区别1. reserve: 分配空间,更改capacity但不改变size2. resize: 分配空间,更改capacity也改变size如果知道vector的大小,resize一下可以当数组来用转载 2016-03-19 15:32:08 · 387 阅读 · 0 评论 -
STL源码剖析——序列容器之vector
http://blog.csdn.net/chenhanzhun/article/details/39287983前言 在STL编程中,我们最常用到的就是容器,容器可分为序列容器和关联容器;本文记录的是我们经常使用的序列容器之vector,vector的数据安排和操作方式类似于C++内置数组类型array,唯一的区别就是在于空间的灵活运用。内置数组array是静态空间,一转载 2016-03-19 16:30:10 · 542 阅读 · 0 评论 -
C++11中的Move语义和右值引用
http://www.cnblogs.com/520zijuan/archive/2013/02/04/2891948.html郑重声明:本文是笔者网上翻译原文,部分有做添加说明,所有权归原文作者!地址:http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html转载 2016-03-19 22:54:18 · 596 阅读 · 0 评论 -
C++11尝鲜:std::move和std::forward源码分析
http://blog.csdn.net/zwvista/article/details/6848582std::move和std::forward是C++0x中新增的标准库函数,分别用于实现移动语义和完美转发。下面让我们分析一下这两个函数在gcc4.6中的具体实现。预备知识引用折叠规则:X& + & => X&X&& + & => X&X& + && =>转载 2016-03-20 11:21:46 · 394 阅读 · 0 评论 -
探索C++0x: 1. 静态断言(static_assert)
转载请注明来源:http://blog.csdn.net/thesys/archive/2010/06/02/5641350.aspx简介C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言。其语法很简单:static_assert(常量表达式,提示字符串)。如果第一个参数常量表达式的值为真(true或者非零值),那么sta转载 2016-03-20 14:09:31 · 361 阅读 · 0 评论 -
详解C++右值引用
C++0x标准出来很长时间了,引入了很多牛逼的特性[1]。其中一个便是右值引用,Thomas Becker的文章[2]很全面的介绍了这个特性,读后有如醍醐灌顶,翻译在此以便深入理解。目录概述move语义右值引用强制move语义右值引用是右值吗?move语义与编译器优化完美转发:问题完美转发:解决方案Rvalue References An转载 2016-03-20 14:54:12 · 510 阅读 · 0 评论 -
什么时候需要用hash_map,什么时候需要用map?
大家都知道在C++的STL中map是使用树来做查找算法,而hash_map使用hash表来排列配对,是使用关键字来计算表位置。那使用起来他们的差别主要是什么呢?对于性能差别是什么,适合什么情况下应用呢?于是我对它们进行了一些测试,并记录了测试数据供大家分享。 测试的内容主要是map和hash_map的添加、删除、查找和遍历操作,首先进行了几组测试,分别是10万次、30万次,时间单位均为毫转载 2016-03-20 16:07:44 · 4231 阅读 · 3 评论 -
C++虚基类的实现机制:笔记
在《深度探索C++对象模型》里,有一个问题,也是去公司面试的时候那些技术人员常问的问题:在C++中,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->mem在实现和效率上有什么不同。答案是:只有一种情况下才有重大差异,该情况必须满足以下3个条件:(1)、obj 是一个虚拟继承的派生类的对象(2)、mem是从虚拟基类派生下来的成转载 2016-03-21 23:06:17 · 418 阅读 · 0 评论 -
关于C++中的虚拟继承的一些总结
http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/05/2537451.html1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承转载 2016-03-21 23:07:26 · 307 阅读 · 0 评论 -
decltype(表达式)
返回值 decltype(表达式)[返回值的类型是表达式参数的类型]这个可也用来决定表达式的类型,就像Bjarne暗示的一样,如果我们需要去初始化某种类型的变量,auto是最简单的选择,但是如果我们所需的类型不是一个变量,例如返回值这时我们可也试一下decltype。现在我们回看一些例子我们先前做过的,[cpp] view转载 2016-04-05 16:00:00 · 624 阅读 · 0 评论 -
构造函数正确的写法是什么?两段式的构造函数
如何写出一个合理的构造函数,因为构造函数内部可能会有内存分配错误等问题。我所知的有两种处理方法。 1.在构造函数里抛出异常。 2.两段式的构造函数,就是说有一个init()的函数,专门负责内存分配等复杂的操作,然后建立一个m_isinit的变量记录是否已经初始化。 这两种方法哪一种较好,或者说有不同的应用场合?还是有其他的更好的写法呢? 还有C++和JAVA两种语言的是否有不同转载 2016-04-05 20:48:23 · 2015 阅读 · 0 评论 -
C++标准库之mutex
互斥锁有可重入、不可重入之分。C++标准库中用mutex表示不可重入的互斥锁,用recursive_mutex表示可重入的互斥锁。为这两个类增加根据时间来阻塞线程的能力,就又有了两个新的互斥锁:timed_mutex(不可重入的锁)、recursive_timed_mutex(可重入的锁)。互斥锁单独使用时主要是为了使对共享资源的互斥使用,即同时只能有一个线程使用,以防止同时使用可能造成的转载 2016-04-06 15:44:04 · 1352 阅读 · 0 评论 -
ifstream对象打开一个文件关闭后再打开另一个文件
ifs.close();ifstream 是有状态的对象,一个 ifstream 操作完后一般处于非正常状态,内部的 eofbit 标记 failbit 标记等可能已被设定。重新打开文件并不会清除这些标记,因此需要添加一步:ifs.clear(); // 去除 ifs 中的错误标记(如文件末尾标记或读取失败标记等)然后再打开新文件即可ifs.open("2.txt");原创 2016-03-24 22:10:16 · 2408 阅读 · 0 评论 -
C++字符串转数字,数字转字符串
http://www.cnblogs.com/emituofo/archive/2011/11/11/2245749.html1. 字符串转数字 如将“32”转为32,将“3.1415”转为3.1415,将“567283”转为567283。使用://Convert string to integer, more @http://www.cplusplus.com/refere转载 2016-03-25 13:38:20 · 393 阅读 · 0 评论 -
SGI STL sort()源码分析
首先将stl sort完整源码列如下所示:template inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) { __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); __STL_REQUIRES(typename i原创 2017-07-09 22:45:27 · 788 阅读 · 0 评论