
C++
cyningsun
这个作者很懒,什么都没留下…
展开
-
循环中输入终结的问题
#include#include #include #include using namespace std;int main(){ vector strVec; string tmp; while (getline(cin,tmp)) strVec.push_back(tmp); sort(strVec.begin(),strVec.end()); copy(strVec.begin(),strVec.end(),ostream_iterator(cout原创 2010-07-08 22:15:00 · 968 阅读 · 2 评论 -
STL经典算法集锦<八>之IntroSort
STL的sort算法的优化策略:1、 数据量大时采用QuickSort,分段递归排序。2、 一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来的额外负荷,就改用Insertion Sort。3、 如果层次过深,还会改用HeapSort4、 “三点中值”获取好的分割IntroSort的实现代码为://数据量的分界线,决定了使用quick so原创 2012-05-08 20:21:47 · 5472 阅读 · 1 评论 -
在libevent中使用线程池
一 线程的初始化1线程对象 在进行事件驱动时,每个线程需建立自己的事件根基。由于libevent未提供线程之间通信的方式,我们采用管道来进行线程的通信。同时为方便主线程分配线程,我们还需保留各个线程的id号。因此我们采用如下结构来保留每个线程的有关信息。typedef struct { pthread_t thread_id; #线程ID转载 2012-08-09 16:33:33 · 2251 阅读 · 0 评论 -
使用libevent编写linux服务
一 libevent简介libevent是一个支持Windows、linux和bsd等平台的网络事件驱动程序库。它支持多种I/O服用机制,按照优先级从高到低依次为:evport、kqueue、epoll、devpoll、rtsig、poll、select。它可根据操作系统,按照优先级从高到底自主选择驱动。 用户可以通过http://www.monkey.org/~provo转载 2012-08-09 15:59:44 · 1509 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记之Data语意学
1、 Data member的布局是怎样的?非静态数据成员1> 在同一个Access Section(也就是private,public,protected等区段)中,较晚出现的数据成员在classobject中有较高的地址。2> 允许编译器将同一类型的多个Acess Section的顺序自由排列,而不必在乎它们的声明次序(但似乎没有编译器这样做)。原创 2012-11-17 18:23:08 · 1264 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记之构造函数语意学
1、 一个类是不是一定有构造函数? C++ Annotated ReferenceManual(ARM):构造函数只在需要的时候才会被编译器产生出来。关键字“在需要的时候”,被谁需要?一种是程序需要的时候,一种是变编译器需要的时候。如果程序有需要(如,完成某些非静态数据成员的初始化),那是程序员的责任,程序员需要自己提供构造函数。如果是编译器需要则才会合成出来默认构造函数。编译器不会替原创 2012-11-17 18:27:10 · 1250 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记之构造、析构、拷贝语意学
1、 继承体系下的对象构造过程是怎样的?1> 调用所有的虚基类构造函数,从左到右,由最深到最浅(别忘记虚基类在对象模型中是以独特的方式支持的,不涉及到在对象模型中的偏移量的问题)2> 调用所有的上一层的基类构造函数,以基类的声明顺序为顺序(这是因为一般基类的subobject都会被放在object的开始,并且按基类声明的次序放置)3> 如果class原创 2012-11-17 18:33:08 · 1449 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记之执行期语意学
1、 如何查看objectfiles中定义的函数和全局变量?好吧,其实这个问题确实与执行期语意学有关。因为编译器需要收集每个全局变量的构造和析构函数,而其实现方式也是使用nm命令打印object file的符号表找出特定开头的名称。所以咯,答案是nm命令。(腾讯面试中,我曾遇到这个,当时没答出来T_T) 2、 operator new()、placement new原创 2012-11-17 18:35:47 · 1219 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记之Function语意学
C++支持三种类型的成员函数:static、nonstatic、virtual 1、C++的设计准则中说:非静态成员函数至少必须和一般的非成员函数有相同的效率。这是如何做到的?C++中的member function实际上被转化为nonmember的形式。下面是转化的步骤:1> 改写函数的原型,安插一个额外的参数(this指针)到member functi原创 2012-11-17 18:29:09 · 1231 阅读 · 0 评论 -
问答学习《深度探索C++对象模型》系列
经过数次翻看《深度探索C++对象模型》和翻看别人的笔记,还是决定自己动手写一下该本书的笔记。笔记采用问答的方式是因为在UC实习时我的指导老师的影响:你不要为了看书而看书,你要从中学到东西就要带着疑问去学习。于是有了这一系列的笔记,感谢我的指导老师让我明白:生命不息,学习不止。第一章:《深度探索C++对象模型》读书笔记之关于对象第二章:《深度探索C++对象模型》读书笔记之构造函数语意学第原创 2012-11-17 18:50:57 · 1095 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记之关于对象
1、C与C++有什么不同呢?前者,数据和处理数据的操作分开声明,程序性地使用全局数据。后者,以ADT或class hierarchy的形式将数据和处理数据的函数封装。 2、细看C与C++的区别可能会有一个问题:加上封装后,布局成本与存取成本增加了多少? 后者的布局和存取成本的增加主要有三种情况:virtual function机制:用于支持一个高效率的执行期绑原创 2012-11-17 18:18:05 · 1222 阅读 · 0 评论 -
STL经典算法集锦<七>之随机洗牌(random_shuffle)
将一个数组中的元素序列打算顺序进行重排,并需要保证重排后的每一种结果是等概率且随机的。下面的两种算法哪一种是正确的?(注:random(a,b)返回一个a~b的随机整数)1. for i=1 to n do swap( a[i], a[random(1,n)] );2. for i=1 to n do swap( a[i], a[random(i,n)] );解释:首先,1~n原创 2012-05-08 13:31:03 · 9912 阅读 · 5 评论 -
正则表达式30分钟入门教程
本文目标30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。如何使用本教程最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——除非你是超人 :)别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然,如果你看完了这篇教程之后,发现自己明转载 2012-12-20 22:14:46 · 737 阅读 · 0 评论 -
位运算实现加减乘除
#include #include //加法运算int add(int a, int b){ return b==0 ? a: add(a^b,(a&b)<<1);}//补码中正数转负数的原理int negative(int a){ return add(1,~a);}//减法运算int sub(int a,int b){ return add(a,negati原创 2012-04-19 00:06:24 · 2160 阅读 · 0 评论 -
补码——计算机中数的表示
(1)正数的补码 与原码相同。(2)负数的补码负数的补码是对其绝对值的原码逐位取反;然后整个数加1。(3)几个特殊数字的补码表示INT_MAX:0111 1111 1111 1111 1111 1111 1111 1111INT_MIN: 1000 0000 0000 0000 0000 0000 0000 0000(无对应的原码)-1: 1原创 2012-04-18 17:59:14 · 1289 阅读 · 0 评论 -
位运算能做什么
1、int变量的奇偶性(变量A) A&1 = 0 (偶数) A&1 = 1 (奇数)2、int变量第K位的操作。(变量A) (A>>K)&1 (比特位) A=A|(1置位) A=A&~(1清零)3、两整数的平均值(变量A、B) (A & B) +原创 2012-04-19 15:48:40 · 2644 阅读 · 1 评论 -
STL经典算法集锦<四>之rotate
STL在rotate上的优化是极尽其所能的。分别对前向访问,双向访问,随机访问的数据结构实现了三个版本的rotate。下面是自己按照对三种算法的理解,自己进行的实现。实现中我尽力避免使用C++的特性,从而以后可以在纯C的代码中使用。下面是我使用到的数据结构,单向链表与双向链表,用于实现算法和验证算法的正确性://单链表节点typedef struct Node* Link;stru原创 2012-04-25 16:47:08 · 2530 阅读 · 0 评论 -
STL经典算法集锦<六>之排列(next_permutation/prev_permutation)
STL中涉及到数组的排列的有两个函数,即next_permutation/prev_permutation,分别用于求上一个以及下一个排列。两函数的算法使用的原理大体相同。以next_permutation为例,列出算法并解释。算法:首先,从最为段开始往前寻找两个相邻的元素,令第一个元素索引为endi第二个元素索引为endii,且满足array[endi]。然后,再从最尾端开始向前检测原创 2012-05-07 15:54:09 · 2453 阅读 · 1 评论 -
line_iterator
<br />#include <iostream>#include <vector>#include<string>#include <algorithm>using namespace std;class line_iterator{ istream* in; string line; bool is_valid; void read() { if(*in) getline(*in,line); is_valid=(*in)?true:fal原创 2010-07-09 00:04:00 · 897 阅读 · 2 评论 -
Istream函数汇总及输入函数总结
Ø gcount()Return valuesThe extraction count.Remarks Use basic_istream::get to read unformatted characters.Example#include using namespace std;int main( ) { cout Ø get()int_type get( );basic_ist原创 2010-07-10 10:26:00 · 2441 阅读 · 0 评论 -
VS2008安装时的“无法加载”的解决
<br /><br />早就听说VS2008出了SP1版本了,想想SP1版总应该比VS2008更稳定或功能更全面、bug更少些吧。因为本来从XP升级到XP SP1里我就是这样想的,于是从网上下载了SP1安装上去。开始感觉没什么,可是到最后接触工作流相关的概念时出现问题了,在VS2008 SP1根本无法使用工作流,总是提示“无法加载C:/document and ……/workflowLibrary1.csproj”的问题。Google了很久,终于原来是SP1惹的祸,网上已经有很多人都发现这个问题了。<br转载 2010-07-18 09:11:00 · 1009 阅读 · 0 评论 -
Office软件安装错误原因及解决办法
<br />ffice 2007 老是装不上,总出现Office 2007 提示找不到文件 比如Office.zh-cn/officeLR.cab(实际上存在该文件)。 以前从来没有出现过这个问题。百度一下,如下解,非常感谢。 根本原因是和VS2008有关(确实我的VS2008来回装了好几遍)也就是说VS2008或Office 2007的不正确卸载会导致这个问题。 并不是什么下载的软件不是正版的问题(我使得可是正宗企业版的)。 解决方法如下: 1. 找到vs2008安装程序(光盘,镜像文件,解压文件都一转载 2010-07-21 23:35:00 · 7307 阅读 · 0 评论 -
编译libtiff和libgeotiff
<br /> <br /> libtiff下载:http://dl.maptools.org/dl/libtiff/<br /> <br /><br /><br /><br /><br /> libgeotiff:http://translate.google.com.hk/translate?hl=zh-CN&sl=en&u=http://geotiff.osgeo.org/&ei=zXFJTMGnMIW6vQO5ldm-Dg&sa=X&oi=translate&ct=result&resnum=1&ve转载 2010-07-23 18:47:00 · 2808 阅读 · 0 评论 -
Windows VC6编译安装Boost库
<br /> 首先从Boost的老巢http://www.boost.org/下载。下载完成以后是一个安装文件(其实就是进行自动解压缩的)。选择你的目录解压缩Boost库。然后我们开始对其进行编译我所下载的版本是1.33.1。1.cmd2.进入安装VC的目录例如c:/Program Files/Microsoft Visual Studio/VC98/Bin目录3.运行VCVARS32.BAT(这个操作的作用是对此控制台注册VC的环境变量,这样我们就可以在任意目录使用cl进行编译程序)。4.进入Boost的转载 2010-07-24 09:04:00 · 923 阅读 · 0 评论 -
VC6.0 覆盖数据的bug
<br /><br />VC6.0 MFC的一个bug:当自己动手添加消息处理的相关数据时,如果没有保存就直接编译,会导致添加的信息部分被覆盖。注意:遇到MFC不提示错误,不处理消息,而消息处理函数又是手动添加的,请注意是不是该bug造成的。<br />解决办法:查看数据,若数据被覆盖,添加数据后立即保存,然后重新构建解决方案(记住不是编译!)原创 2010-08-14 18:52:00 · 1094 阅读 · 0 评论 -
深浅复制产生的根本原因
复制构造函数产生浅复制的根本原因在于,用户自定义的构造函数内部做了分配内存空间的工作,这是默认复制复制函数无法完成的工作。然而在析构函数执行时,却同样的要求两者声明的变量都要释放内存。最终的结果便是浅复制的产生。而如果要解决这个问题就必须让复制构造函数实现与构造函数同样的工作,及用户自定义一个具有相同功能的复制构造函数。(析构已经不存在的内存,必然导致错误)原创 2010-09-23 22:14:00 · 751 阅读 · 0 评论 -
“Memo桌面便笺”总结
问题:1.在CtrlColor函数中设置字体颜色,利用SetTextColor(),结果字体颜色无法改变原因:CtrlColor函数中默认生成的函数返回值是NULL,这样设备描述表中的便不具备画刷,所以SetTextColor()函数不起作用解决:调用SetTextColor的同时在CtrlColor函数中创建一个画刷并返回问题:2.主窗口中只有一个编辑框而在开始运行时不希望他获得输入焦点解决:将Edit设置为ReadOnly3.窗口接收消息时不接收覆盖在它之上的窗口产生的消息,所以消息处理要弄清楚位置4.原创 2010-10-07 22:12:00 · 1460 阅读 · 2 评论 -
VS2008提示PNG图片加载不正确
<br />使用PNG图片进行编程有时会出现PNG格式不正确让重新加载的提示。也算是VS2008的一个bug吧,编译器把资源格式PNG更改为了BITMAP,不知情的多数情况下的第一反应是删除资源重新加载。<br /> <br />便捷的方法:按提示打开资源文件文件,将路径前BITMAP的格式标识全部换为PNG,然后保存,关闭。一切搞定原创 2010-10-07 22:22:00 · 2091 阅读 · 0 评论 -
enum { IDD = XXX };未命名标识符
<br /> 首次使用VS2010类向导添加完成函数就报错:未命名的标识符。双击后跳到下图位置<br /> <br /><br /> <br /> <br />原因:类中的#include "Resource.h"被删除了<br /> <br />解决办法:在相应的类中添加#include "Resource.h"<br />原创 2010-12-24 21:11:00 · 1964 阅读 · 0 评论 -
error C4430: 缺少类型说明符
<br /><br />error C2143: 语法错误 : 缺少“;”(在“*”的前面)<br />error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int<br />error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int<br /> <br />目前遇到的产生错误的原因有两个:<br />① 未包含相应类的头文件<br />② 文件之间产生了无限递归终止<br />通常在文件的头都会定义” #pragma once”原创 2010-12-30 22:44:00 · 2870 阅读 · 0 评论 -
operator new()、placement new()与new关键字
1>所谓的new,可以分为两种。operator new和placement new。而我们经常使用的new关键字。int *p=new int;上述语句发生的调用过程为:::operator new (sizeof(int));由全局函数new分配内存大小为两个字节的内存区域。接下来调用new(p)int();此次调用的为placement new(),将int()产生的对象”放置”到p所指向的内存区域int()产生的对象将该内存区域初始化为0。2> operator new和placement new原创 2011-03-03 18:23:00 · 1060 阅读 · 0 评论 -
size_t(-1) / sizeof(_Tp)到底是何意义?
Ø size_t(-1)/sizeof(_Tp)到底是什么意义?以32位机来说,它代表了实现/平台允许你放入容器的最大元素数目,对于std::vector最大容量为2^32 / sizeof(T) 个元素。换句话来说, 也就是我能完全使用4GiB虚拟内存地址空间(实际不可能)而填充的最大元素数目。Ø 为什么size_t(-1)为2^32?size_t通常在32位机上定义为32位,而在64位机上定义为64位的无符号整型。通过强制类型转换,size_t(-1)恰能代表其能表示的最大值,即2^32 (2^64原创 2011-03-06 20:05:00 · 2942 阅读 · 0 评论 -
STL经典算法集锦<五>之查找(lower_bound/upper_bound/binary_search)
这三个算法都比较的常用,而且具有一定的相似的性。理论依据也很明显,下面就直接贴出自己的实现版本。其中lower_bound与upper_bound实现了两个版本。版本一与STL的实现方法完全相同,以数据的总长度折半,版本二则是直接取前后的中点。当然本质上没有太大区别。lower_bound版本一:int lowerBound(int array[],int left,int right,i原创 2012-04-25 17:01:06 · 2506 阅读 · 0 评论 -
C++限定符总结
概念:连接:在一个执行程序中,标识符代表存放变量或者被编译过的函数体的存储空间。连接用链接器所见的方式描述存储空间。连接的方式有两种,内部链接和外部链接:内部链接意味着只对正被编译的文件创建存储空间。用内部链接,别的文件可以使用相同的标识符或全局变量,链接器不会发现冲突——也就是为每一个标识符创建单独的存储空间。在C和C++众内部链接由关键字static指定。外部链接意味着为所有被编译原创 2013-05-27 11:47:18 · 3087 阅读 · 0 评论