C/C++
文章平均质量分 68
如沐春风心旷神怡
成功等于坚定的信念加上不间断的努力
展开
-
Python 文本挖掘:使用gensim进行文本相似度计算
在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性。评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的属性和特性,角度更客观。那么Python 里面有计算文本相似度的程序包吗,恭喜你,不仅有,而且很好很强大。这是从52nlp大神的博客里面发现的,其实具体的处理流程和程序和他的基本一致,转载 2015-11-27 14:38:35 · 51952 阅读 · 2 评论 -
C++类的构造函数和析构函数的调用顺序
有时候我们做一些笔试或者是面试中可能会遇到定义一些类,然后叫你写出类的构造函数和析构函数调用顺序。这时候我们就需要对这个有了解才能够正确的做出来。先看看下面的一段代码。#include using namespace std;class A {public: A() { cout << "A()" << endl; } ~A() {转载 2015-08-09 23:56:20 · 483 阅读 · 0 评论 -
C++中虚函数内存布局
由sizeof()求带有虚函数的类的大小引发的思考,在查看相关资料的过程中看到了陈皓先生的一篇文章《C++ 虚函数表解析》(详情见http://blog.csdn.net/haoel)觉得讲的十分的好,只是看完之后仍对为什么要又为什么可以由父类的指针调用子类的对象的虚函数不解,如这种典型的描述:Derive d;//Derive 是Base的子类Base *b1 = &d;//这必转载 2015-08-09 16:18:00 · 776 阅读 · 0 评论 -
C语言中32位和64位的数据类型长度
char *long字符指针和长整形有不同,在32位下是4个字节,在64位是8个字节。原创 2015-08-09 11:43:28 · 5955 阅读 · 0 评论 -
内存池的实现(一)
引言C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放,有以下弊端:调用malloc/new,系统需要根据“最先匹配”、“最优匹配”或其他算法在内存空闲块表中查找一块空闲内存,调用free/delete,系统可能需要合并空闲内转载 2015-05-08 10:13:23 · 582 阅读 · 0 评论 -
C++ 线程安全的单例模式
废话不多说,常用的代码积淀下来。一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。1、静态成员实转载 2015-05-06 14:05:37 · 658 阅读 · 0 评论 -
内存池的实现(二)
《内存池的实现(一)》中,介绍了使用内存池的原因,设计内存池应该考虑的问题,最后给出一个简单的内存池实现例子。使用上一篇文章中介绍的内存池实现方案,要在一定的限定条件下,下面我们来看更通用的内存池实现——Apache服务器的内存池实现。 Apache服务器的开发人员将代码中可移植的部分整理出来,编辑成Apache可移植运行库(Apacheportable Run-timelibra转载 2015-05-08 10:16:47 · 433 阅读 · 0 评论 -
C++中的单例模式
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。 单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做转载 2015-05-06 14:10:48 · 443 阅读 · 0 评论 -
内存池
引言本书主要针对的是 C++ 程序的性能优化,深入介绍 C++ 程序性能优化的方法和实例。全书由 4 个篇组成,第 1 篇介绍 C++ 语言的对象模型,该篇是优化 C++ 程序的基础;第 2 篇主要针对如何优化 C++ 程序的内存使用;第 3 篇介绍如何优化程序的启动性能;第 4 篇介绍了三类性能优化工具,即内存分析工具、性能分析工具和 I/O 检测工具,它们是测量程序性能的利器。本章首先简单介绍转载 2015-05-07 16:28:37 · 445 阅读 · 0 评论 -
C++中的static关键字
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:[cpp] view转载 2015-05-06 11:27:13 · 417 阅读 · 0 评论 -
float double的内存表示及比较大小的方法
float和double类型的内存分布和比较方法收藏Comparing floating point numbers 总结几点:0. float占4byte,精度是6~7位;double占8byte,精度是15~16位。 1. C/C++的浮点数据类型有float和double两种。它们在内存中是以科学计数法的结果来存储的。 类型float大小转载 2015-04-01 16:33:39 · 1091 阅读 · 0 评论 -
深拷贝和浅拷贝
简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!原创 2014-11-06 21:41:59 · 457 阅读 · 0 评论 -
多线程经典面试题
一个比较完整的解答。不过很多概念都是针对windows下的多线程。--------------------------------------1、基本概念 详见:线程和进程关系和区别、同步和互斥、进程间通信2、以下多线程对int型变量x的操作,哪几个不需要进行同步(D) A. x=y; B. x++; C. ++x;转载 2015-03-26 17:10:49 · 4487 阅读 · 0 评论 -
C++ 线程池的封装实现
这篇文章谈到了:为什么要使用线程池?线程的一些缺陷不足线程池的构造?通过图形象的说明。三个队列:工作队列,工作线程队列,忙碌线程队列还有附有实例代码。所以是一个入门的概念性了解的好文。为了充分利用多核的优势,我们利用多线程来进行任务处理,但线程也同样不能滥用,会带来一下几个问题:1)线程本身存在开销,系统必须为每个线程分配如栈,TLS(线程局部存储),寄存器等。转载 2015-01-27 10:51:02 · 1174 阅读 · 0 评论 -
关于dynamic_cast
1.dynamic_cast详解http://blog.csdn.net/chencheng126/article/details/431538372.使用dynamic_cast的一点使用心得使用dynamic_cast,可以利用c++在运行中检查的机制。http://blog.csdn.net/chencheng126/article/details/4315392原创 2015-03-16 10:58:08 · 466 阅读 · 0 评论 -
取余与位运算
在C风格语言中(比如C,C++,C# (注:排名按出生日期 ^_^)),取余运算符定义为“%”。但在很久很久以前,CPU采用如下方法计算余数(注意,该方法只对2的N次方数系有效):X & (2^N - 1)首先从求余数谈起,我们知道,计算机中存储的方式是0和1序列:1 0001 2^02 0010 2^13 0011 2^1 + 14 0100 2^转载 2015-08-11 15:11:21 · 6033 阅读 · 0 评论 -
C语言中的未定义行为
C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么转载 2015-08-10 22:41:59 · 4856 阅读 · 1 评论 -
继承和组合
C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承”。我们要给“继承”立一些使用规则: 一、如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B 继承A 的功能。 不要觉得“不吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体。 二、如果类B 有必要使用A 的功能,则要分两种情况考虑:(1)若在逻辑上转载 2015-11-16 17:30:05 · 422 阅读 · 0 评论 -
虚函数的一个例子
做了一个虚函数的例子。在父函数中指定了print是虚函数,那么父类就可以调用子类的print方法。答案是:A::constructB::constructThis is BB::destroyA::destroy请按任意键继续. . .注意:1,2,用指针或者引用将B传个A,虚函数生效。3直接值传递,不生效。#include usin原创 2015-11-08 10:50:02 · 1767 阅读 · 0 评论 -
总结之多态和虚函数
1.C++的多态和虚函数这是一篇很好的文章。很清楚的介绍了多态以及虚函数,给出了例子。非常好http://blog.csdn.net/chencheng126/article/details/424683452.关于dynamic_casthttp://blog.csdn.net/chencheng126/article/details/44302579原创 2015-03-16 13:54:58 · 429 阅读 · 0 评论 -
回调函数一个例子
什么是回调函数?回调函数就是函数形参中包含一个函数指针,实现的时候这个函数指针可以指向它的实现函数。这样就可以实现,定义函数,让回调函数来调用,调用和调用者分离了。举个例子:typedef int(*callbackFun)*(char *p) //定一个回调函数模型定义两个方法int funcA(char *p) //方法A{//...};原创 2015-11-07 20:38:51 · 821 阅读 · 0 评论 -
迭代器删除元素
1.序列容器,比如vector序列容器的erase返回的是被删除元素后的有效迭代器。vector vec;vector::iterator iter;for(iter = vec.begin();iter!=vec.end();){ if(need_delete) {iter = vec.erase(iter); }else++iter;}原创 2015-11-07 22:44:27 · 2435 阅读 · 0 评论 -
总结之回调函数
什么是回调函数?它的作用是什么?如何实现?回调函数是通过函数指针来实现的,函数指针作为参数传递给另一个函数,这个函数被用为调用它所指向的函数。简言之,自己定义好,让别人来调用。回调函数的应用:1.通知机制。在程序中设置定时器,当时间到时通知程序,但是通知机制对于程序一无所知,这个时候就可以用到回调函数。用一个特定的函数指针,进行回调,通知程序事件发生。2.库的一些算原创 2015-02-27 16:40:57 · 592 阅读 · 0 评论 -
Sting类的实现
为什么要进行操作符重载?举个例子,正常的数字才可以进行加,如果对string进行+,实际上进行的是拼接的操作。那么这个时候,就需要对+进行操作符重载, 实现拼接的操作。‘为什么赋值操作符(=)重载需要返回引用?因为返回的是自己,而不是自己的一个拷贝。什么是this指针?this指针表示的类对象本身。它只作用在非静态成员函数中,作为一个隐藏参数。所以它的生原创 2015-11-07 19:45:23 · 862 阅读 · 0 评论 -
C++常见多线程编程
这些题的解答可以参考另一个链接:http://blog.csdn.net/chencheng126/article/details/44652533这篇文章的一些亮点,如:对多线程的同步和互斥的区别,举得例子很清楚。就是生产者和多个消费者之间的关系。生产者和消费者之间是同步,而多个消费者之间是互斥。--------------------------------转载 2015-03-26 17:17:48 · 3882 阅读 · 1 评论 -
总计之一些典型的题
1.count words一个比较好的关于map,vector,map的例子http://blog.csdn.net/chencheng126/article/details/417928552.二进制中包含1的数量关于与运算,比较巧的例子http://blog.csdn.net/chencheng126/article/details/38829097原创 2015-03-16 13:58:04 · 488 阅读 · 0 评论 -
Epoll简介以及例子
第一部分:Epoll简介问题 : Select,Poll和Epoll的区别答案 : Epoll和Select的区别1. 遍历方式的区别。select判断是否有事件发生是遍历的,而epoll是事件响应的,一旦句柄上有事件来了,就马上选出来。2. 数目的区别。select一般由一个内核参数(1024)限制了监听的句柄数,但是转载 2015-05-04 12:51:24 · 1977 阅读 · 0 评论 -
Epoll模型详解
Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。1、为什么select落后 首先,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,在 我用的2.6.15-25-386内核中,该值是1024,搜转载 2015-04-30 17:15:57 · 2791 阅读 · 0 评论 -
如何只在堆或者栈上分配类对象
昨天一个同学去网易面试C++研发,问到了这么一个问题:如何限制一个类对象只在栈(堆)上分配空间?一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类。这能不能实现呢?仔细想想,其实也是可以滴。在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。转载 2015-08-13 13:42:11 · 1909 阅读 · 0 评论 -
C++类内存分布
书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到转载 2015-08-12 17:13:08 · 423 阅读 · 0 评论 -
在遍历中使用 iterator/reverse_iterator 进行 Erase 的用法
众所周知,在使用迭代器遍历 STL 容器时,需要特别留意是否在循环中修改了迭代器而导致迭代器失效的情形。下面我来总结一下在对各种容器进行正向和反向遍历过程中删除元素时,正确更新迭代器的用法。本文源码:https://code.csdn.net/snippets/173595首先,要明白使用正向迭代器(iterator)进行反向遍历是错误的用法,要不干嘛要有反向迭代器呢(reverse_it转载 2015-08-11 09:23:47 · 632 阅读 · 0 评论 -
总结之泛型
1.自己写的几个例子(C++中泛型)http://blog.csdn.net/chencheng126/article/details/418773732.自己写的一个新的vec来实现vectorhttp://blog.csdn.net/chencheng126/article/details/41984257原创 2015-03-16 13:51:53 · 411 阅读 · 0 评论 -
二叉树的遍历
前序遍历非递归:每次都是走树的左子树,直到左子树为空,然后从递归的最深处返回到父节点,访问右节点。因此,这里需要一个方法来对节点序列来回溯。将访问途中遇到的节点都记录下来。vector preOrder1(TreeNode *root){ stack s; vector result; TreeNode *p = root; while(p!=NULL || !s.empty(原创 2015-03-04 00:55:57 · 547 阅读 · 0 评论 -
C++中overload,override,overwrite的区别详细解析
Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。Override(覆盖):是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相转载 2015-01-29 10:45:51 · 1123 阅读 · 0 评论 -
学习linux下的c/c++编程
1,先有linux环境搭minGW和cygwin都有点麻烦,最最简单的办法还是装个真正的linux,用虚拟机也好,在网络上的另一台机器也好。这样不仅快,而且你有了真正的环境。2.会C/C++语言(估计你会的)3.入门阶段熟悉gcc命令行,最基本的参数,如,-g,-W,-O,-o,-c 建议看man gcc(很大找想要的)4.编译第一个helloworld程序: 基本命令 gcc h转载 2014-10-19 21:17:48 · 525 阅读 · 0 评论 -
11个强大的Visual Studio调试小技巧
这是一篇非常好的关于使用visual studio进行调试的技巧。相信,如果能够熟练使用,可以大大的增加效率。简介 调试是软件开发周期中很重要的一部分。它具有挑战性,同时也很让人疑惑和烦恼。总的来说,对于稍大一点的程序,调试是不可避免的。最近几年,调试工具的发展让很多调试任务变的越来越简单和省时。 这篇文章总结了可能节省你大量时间的 11 个 Vis转载 2015-01-29 14:56:35 · 598 阅读 · 0 评论 -
C++面试资料之问答题集合(找工作复习)
1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。extern "C"是连接申明(linkage declaration)转载 2015-01-26 17:14:32 · 1329 阅读 · 0 评论 -
C++为什么基类的析构函数是虚函数
注:本文内容来源于zhice163博文,感谢作者的整理。1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 下面转自网络:源地址 http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html a.第一段代码#includeusing nam转载 2015-01-26 17:12:04 · 524 阅读 · 0 评论 -
谈谈网络编程(基于C++)
这篇文章讲了一点网络编程的一些新路,一点体悟。学习就是这种不断总结提高的过程。设计到进程,线程,线程池,reactior和proactor并发编程模式,IOCP,linux下的epoll。。。。。我从事的是企业级的软件开发,纵观当今的企业级软件,单机模型已经越来越少,更多的是C/S模型,目前 client 和 server 之间通信是通过 socket 技术转载 2015-01-27 10:28:24 · 13967 阅读 · 2 评论 -
C++抽象基类
为什么C++要定义抽象基类?C++为什么要定义抽象基类? 抽象类就是类里定义了纯虚成员函数的类。纯虚函数只提供了接口,并没有具体实现。抽象类不能被实例化,通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。为什么要定义抽象基类呢?依我所见主要有以下原因:1. 最重要的原因是,可以将接口与实现分离。接口是软件产品最有价值的资源,设计接口比转载 2015-01-27 09:52:42 · 1605 阅读 · 0 评论