C/C++、STL、泛型编程
xiaoding133
My name is Ma dingding. I’m a student, and software cultivator living in NanJing. This is my software development blog. I also study the aspect of speech recognition.If you are on Weibo,you can follow me at @xiaoding133.
展开
-
支持按行号区域文本选择的NotePad++插件开发
最近发现NotePad++不支持按行号区间的文本复制,就想自己动手开发一个NotePad++插件,支持输入起始行号和结束行号,然后复制该区域的文本到新文档或者复制到系统剪切板,方便文本的操作。效果如下图: 本文主要介绍NotePad++插件开发的基本流程以及相关的注意点。1、Notepad++介绍Notepad++是使用C++开发的开源免费的文本编辑器,原创 2015-07-18 23:37:35 · 4720 阅读 · 0 评论 -
如何减少C++程序的重复编译?
大多数面向对象程序设计都提倡封装:我们应该隐藏实现细节的类,尽可能减少对象之间的耦合。但在C ++(包括其他编译语言),我们还需要关心其他方面的设计。如何才能做到这一点呢? 一个普通类的例子:#include "Engine.h"#include "Gearbox.h"#include "..."#include "Wheels.h"class Car{原创 2013-03-22 19:46:46 · 1502 阅读 · 0 评论 -
十步法将递归程序快速转变成迭代或循环程序
前言:在有些情况下,我们更倾向于使用递归函数,如排序(合并排序)或树相关操作的算法(heapify/ heapify)。但是,递归函数在某些环境中,如在Visual C ++中,如果调用层次过深,可能会出现如堆栈溢出。许多专业的开发人员可能已经知道如何更改递归功能用迭代函数或使用栈(堆栈)和while循环解决(模拟递归的过程)堆栈溢出问题。 如果您使用的是递归函数,因为你不控制调原创 2013-03-23 14:43:52 · 2478 阅读 · 3 评论 -
C/C++文件输入输出操作——FILE*、fstream、windowsAPI
基于C的文件操作 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。一、流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio.h中定义如下:typedef struct {int level; /* fill/empty level of buffer */unsigned flags; /* Fil转载 2013-01-10 21:18:44 · 1649 阅读 · 0 评论 -
c/c++数据类型转换1(float,char,string,CString )
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。 在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公转载 2013-01-10 21:21:36 · 4936 阅读 · 0 评论 -
C语言背景知识
B语言--C语言的前身B语言 http://zh.wikipedia.org/wiki/B语言THE PROGRAMMING LANGUAGE B http://cm.bell-labs.com/cm/cs/who/dmr/bintro.htmlA TUTORIAL INTRODUCTION TO THE LANGUAGE B http://cm.bell-labs.com/c原创 2012-12-17 18:48:09 · 1434 阅读 · 0 评论 -
MFC 中错误处理信息FormatMessage
BOOL CMyClass::ReadFile(const CString & filename) { CFile f; if(!f.Open(filename, CFile::modeRead)) { /* Failed */ DWORD err = ::GetLastError(); // [1]翻译 2011-09-14 13:26:53 · 1695 阅读 · 0 评论 -
在Win32下让窗口居中
BOOL CenterWindow(HWND hwndWindow){ HWND hwndParent; RECT rectWindow, rectParent; // make the window relative to its parent if ((hwndParent = GetParent(hwndWindow)) != NUL翻译 2011-09-14 12:31:27 · 3190 阅读 · 0 评论 -
C++回调函数问题的解决方案
例子源代码下载地址:http://download.csdn.net/detail/xiaoding133/45271651.问题提出C++不像其他面向对象语言(如Object Pascal,Ada语言,Java和C#)提供了将一个类的方法作为回调函数的解决方案。在C语言中,这些回调函数普遍存在以事件驱动的应用程序当中。问题的解决是围绕这样一个事实:即一个特定的类的多个实例存放于不同的内存原创 2012-08-26 19:49:45 · 1393 阅读 · 0 评论 -
【C++泛型编程】Typelists型别工具
Typelists是一个用来操作一大群型别的C++工具,就像lists对数值提供各种基本操作一样。1.定义Typelists Typelist是以一种特殊的型别结束:NullTypeclass NullType {}; struct EmptyType {}; // could be instantiated template st原创 2012-09-04 15:28:36 · 1365 阅读 · 0 评论 -
【C++泛型编程】编译期型别判断(Type Traits)
1.编译期型别判断(Type Traits) 编译期型别判断犹如在执行期根据数值进行判断,那么型别判断在什么情况下使用呢?举个例子:假设你想写个copying 算法:templateOutIt copy(InIt first,InIt last,OutIt result){for(;first!=last;++first,++result) *resul原创 2012-09-02 19:59:58 · 7560 阅读 · 0 评论 -
【C++STL】C++ Standard Template Library三个重要元素
一、STL三个最重要的元素是容器,迭代器,算法1.容器容器是用来管理其他对象的对象,让用户来决定是使用值还是引用。容器一般用模板类来实现。STL并没有采用面向对象的技术,所以STL中并没有一个通用的容器类,即没有统一的基类。2.迭代器迭代器的工作方式如指针。根据不同的应用,它可能是普通的指针或者是对象指针。迭代器通常用来获取容器中的元素,可以从第一个元素移动到另外一个元原创 2012-08-10 12:36:32 · 1019 阅读 · 0 评论 -
【C++泛型编程】编译期可转换性和继承性检测
问题:在设计模板函数和模板类时,面对两个型别T和U,我们怎么判断U是否继承自T呢?如果能在编译器判断这样的关系,可以优化泛型编程的函数。在编译器发现这样的关系,就意味着可以不使用dynamic_cast,它会损耗执行效率。 继承性检测可以转化成一个更一般的问题:检测任意型别T是否可以自动转化成型别U? 解决方法:可以使用运用sizeof和函数重载的方法来检测这种可转换性。编原创 2012-09-01 19:24:46 · 1894 阅读 · 0 评论 -
C++编程规范学习总结
一、头文件 所有头文件都应该使用#define 防止头文件被多重包含(multiple inclusion),命名格式当是:___H_为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。例如,项目foo 中的头文件foo/src/bar/baz.h 按如下方式保护:#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_...#e原创 2011-09-29 20:13:47 · 763 阅读 · 0 评论 -
【C++泛型编程】基于策略(Policy)的类设计
基于策略(Policy)的类设计是将templates和多重继承组合起来,这样可以产生程序库中的“设计元素”。Policies由templates和多重继承组成。一个class如果使用了policies,就称其为host class,那是一个拥有多个template参数的class template,每一个参数代表一个policy.host class所有的机能都来自policies,运作起来就像原创 2012-08-31 15:51:22 · 2824 阅读 · 1 评论 -
MFC如何自定义消息与在线程中向主窗体控件发送数据
如何定义消息:1.定义消息:在对话框类的头文件中定义一个自定义消息#define WM_MY_MESSAGE WM_USER+100 2.在类中声明该消息的处理函数:在该类声明的内部的protected:下声明如:afx_msg LRESULT MyMessage(WPARAM wParam,LPARAM lParam);3.在类的消息映射表中加入映射项在该类的源原创 2013-03-25 18:22:26 · 1589 阅读 · 0 评论 -
TCHAR,WCHAR,LPSTR,LPWSTR,LPCSTR的区别
在C++的窗口应用程序开发过程中,我们经常对TCHAR,LPCTSTR这样的关键字迷惑。接下来将详细解释他们之间的区别。 通常,一个字符可以用1个字节或两个字节来表示。1个字节的字符为ANSI编码字符,通常所有的英文字符都采用ANSI编码。2个字节的字符为Unicode编码,可以表示世界上所有的语言。 在VC++编译器中,分别用char和wchar_t数原创 2013-03-30 13:50:30 · 2375 阅读 · 0 评论 -
一个移位操作引发的程序Bug
最近在开发一个有关IPV6的项目,碰到一个非常奇怪的问题,在计算IPV6的子网掩码的时候,网络前缀为8,16,48,80,112能计算正确,当网络前缀为32,64,96计算错误。这个问题花了近一天的时间定位和修改。计算IPV6子网掩码的函数如下:#include#include#define MAX_IP_SEG 4class CIPV6Address{public:原创 2015-05-16 17:46:05 · 4477 阅读 · 0 评论 -
减少编译时源文件之间的依赖
描述:在大型项目开发中,往往编译时间非常长,我见过需要编译15分钟的项目,这对于开发人员来说无疑是无奈的等待。如果每次一个小的代码修改,整个项目都要重新编译的话,时间成本是非常高,为了说明这个问题,下面举一个例子: 如下类:A.hppclass A{public: void foo(); private: AMember m_member;}原创 2015-05-09 10:23:29 · 2288 阅读 · 0 评论 -
基于Table方法降低代码圈复杂度
描述: 在项目开发过程中,经常要求圈复杂度不能超过10,有时候写着写着圈复杂度就很大,我在项目代码中见过函数圈复杂度大于100的函数,由于历史的原因,代码越积越多,没人出去重构,导致后面很难懂和维护,所以在编码初期就应该在心中有个要求,就是圈复杂度不能超过10,如果超过10,肯定是代码逻辑写的过于复杂,要回过头来想想怎么去分解功能,让流程简单易懂。原创 2015-04-25 22:01:30 · 6652 阅读 · 0 评论 -
创建型模式之工厂模式(Factory Pattern)C++实现******
工厂模式(Factory Pattern)创建型模式.解决:如何将实例化具体类的代码从应用中抽离,或封装起来,使它们不会干扰应用的其他部分.专门负责创建各类对象的新对象叫做”工厂”.工厂处理创建对象的细节.简单工厂模式不是一种模式,只是一种编程习惯.有的人直接把它当作”工厂模式”.我们需要提供一个对象创建对象的接口,并在子类中提供其具体实现(因为只有在子类中可以决定到底实例化哪一个原创 2012-06-29 21:18:40 · 1511 阅读 · 0 评论 -
[设计模式]两种方法实现简单工厂模式
1.描述在项目开发中经常会遇到根据不同的条件创建不同的对象,然后对该对象进行操作,一般都包括许多的switch -case分支如下:CBase* pBase(NULL);switch (type_variable){ case obj1: pBase = new CBaseDerivate1();break; case obj2: pBase = new CBaseDe原创 2015-04-11 14:54:20 · 4212 阅读 · 2 评论 -
【C++泛型编程】编译期错误检测
泛型编程如果需要在各个平台上进行移植,并且保证不让移植的代码出现潜在的错误,我们需要采用编译期错误检测而不是执行期的错误检测。随着泛型编程在C++中广泛运用,更好的静态检验以及更好的可定制型错误消息的需求浮现了出来。例子:如下安全转型的函数 templateTo safe_reinterpret_cast(From from){ assert(sizeof(From原创 2012-08-31 18:51:53 · 1884 阅读 · 0 评论 -
【C++泛型编程】模板偏特化、局部类和型别映射(Int2Type,Type2Type)以及型别选择
1.模板偏特化 模板偏特化是让你在template的所有可能实体中特化出一组子集。下面是一个模板全特化的例子,假设有一个类模板,名为Widget:templateclass Widget{....各种操作.....};特化的情况如下:templateclass Widget{...各种特化后的操作...};其中ModalDia原创 2012-08-31 20:11:12 · 2753 阅读 · 3 评论 -
有关动态创建释放二维数组,以及指向数组的指针问题集合 .
转载地址:http://blog.sina.com.cn/s/blog_6a0cb8bc0100u49x.html今天写程序,因为涉及到二维数组的动态创建及释放问题,浏览了相关的文章才发现我的思路有些错误;我一直认为二维数组名就是指针的指针: 例如: int** b; i转载 2013-10-23 20:25:04 · 1326 阅读 · 0 评论 -
C++ STL:vector和list
STL 描述:C++标准模块库是一个提供了公共编程数据结构和函数的模板类集合,如双连接表(list),配对数组(map),可扩展数组(vector),大串的存储操作(rope)等。STL库可以从http://www.sgi.com/tech/stl/ 获取。STL可以分为以下几类:容器类:顺序容器:vector:动态数组变量,结构体或对象。可以插入在末尾插入原创 2013-09-19 11:42:52 · 5786 阅读 · 0 评论 -
C++模板:函数模板、类模板、模板与继承
C++模板:描述 C++提供一种模板的机制来减少代码重复。比如:对于同一样函数使用不同的数据类型,int,double,char等。C++模板属于“元编程”的范畴。C++ 模板函数: 1.支持不同数据类型的函数重载:#include using namespace std;int square (int x){原创 2013-09-13 23:09:29 · 51304 阅读 · 3 评论 -
算术表达式树
一个面向对象范例(算术表达式树)1. 问题描述用程序来表示算术表达式。例如表达式(-5)*(3+4)对应的树如下:该表达式树包括常数、一元运算符和二元运算符的节点。编写合适的函数来创建这样的树,然后打印该树的完整括号形式。2. 分析考虑定义一系列的类,用继承组织起来。这些类有一些共同的点:每个类都要存储一个值以及一些子节点。图中有三种节点:一种表示整数表原创 2013-09-01 10:08:08 · 4639 阅读 · 0 评论 -
如何设计容器类
设计容器类1. 设计原则a. 包含什么?即容器中放入什么东西,是包含对象吗?包含一个对象的确切含义是什么呢?容器应该包含放在其中的对象的副本,而不是原对象本身。即可以把指向该对象的指针放入到容器中。b. 复制容器意味着什么?容器称为模板,而容器内的对象的类型就是模板参数。复制容器是不是也应该复制包含在容器中的对象呢?Container c1;Contai原创 2013-09-01 17:31:08 · 1771 阅读 · 0 评论 -
静态链接库(Lib)和动态链接库(DLL)
序言:本文主要讲解静态链接库和动态链接库的区别,以及怎么样编译和引用两种库,怎么样从DLL中导出函数和导出C++类。一、静态链接库和动态链接库 1.静态链接库(.LIB):函数和数据被编译进一个二进制文件。发布时,只需要发布这个可执行文件,并不需要发布被使用的静态库。 2.动态库(.DLL):在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文原创 2013-05-25 21:27:55 · 8936 阅读 · 1 评论 -
【排序算法】合并排序超级总结
一、介绍基本的排序算法主要可以分为两大类。第一类时基于逐个比较的,第二类是非比较的。插入排序Insertion sort,冒泡排序bubble,和希尔排序Shell sort都是基于比较模型的。这三个算法的时间复杂度为O(n^2),实在是太慢了。是否有可能比O(n^2)更快的排序方法呢?答案当然是有的。前面三种算法都是从待排序列表开始比较其中的每两个元素大小。插入排序和冒泡排序作了很多次比原创 2012-05-17 14:07:51 · 1627 阅读 · 0 评论 -
C++顺序表的实现(采用模板)
(数组描述)采用模板#ifndef CLinearList_#define CLinearList_#includetemplate class CLinearList {public: CLinearList(int MaxListSize=10); //构造函数 virtual ~CLinearList(); bool IsEmpty() const原创 2011-09-29 13:25:33 · 6408 阅读 · 1 评论 -
创建型模式之单件模式(Singleton Pattern )C++实现
单件模式(Singleton Pattern)创建型模式定义:确保一个类只有一个实例,并提供全局访问点。用来创建独一无二,只能有一个实例的对象的入场券。它是所有设计模式类图中最简单的。该模式在开发中非常有用。实现单件模式需要私有的构造器、一个静态的方法和一个静态的变量。该模式通常与抽象工厂模式或工厂模式配合使用,因为我们只需要一个工厂来创建对象。该模式最简单,C++的实原创 2012-06-30 18:08:34 · 1117 阅读 · 0 评论 -
Understanding and Implementing Observer Pattern in C++
IntroductionThis article presents the basics of Observer Pattern, when to use it and how to implement it in C++. I have posted a similar article that talks about the Observer pattern in C#. The main转载 2012-02-29 13:17:37 · 621 阅读 · 0 评论 -
C++向量Vector模板的实现
在项目中需要使用向量的时候,可以使用C++自带的vector.h来实现向量的存储,也可以自己实现向量的类。。下面给出自己定义的向量类,需要什么函数都可以自己定义,是不是来的很方便呢。。。。:/*********************************************************************//*原创 2012-03-19 20:54:33 · 9094 阅读 · 0 评论 -
Linux下C的编译和链接
1.源程序的编译/* main.c */#include "mytool1.h"#include "mytool2.h"int main(int argc,char **argv){mytool1_print("hello");mytool2_print("hello");}/* mytool1.h */#ifndef _MYTOOL_1_H#defin原创 2012-03-16 19:47:04 · 1598 阅读 · 0 评论 -
C 编程总结
C 编程基础选择变量标准:够用就好,不是越大越好int x;占用两个字节long y; 占4个字节的空间短整型常量:-32768~32767 认为它是int型,它可以赋值给int型和long int类型长整型:long int 如果某一计算机的C版本确定的short int 与int 型数据在内存中占据的长度相同,则它的表示范围与int相同。因此一个int型的常量也同时原创 2012-03-10 14:04:54 · 1321 阅读 · 0 评论 -
Matlab中mex与C混合编程总结
使用mex和C可以加快算法的运行速度,mex文件包含一个入口函数如下:void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] ) 入口函数有四个参数:prhs为mxArray结构体类型的指针数组,该数组的元素按顺序指向所有的输入参数;nrhs为整数类型,它标明了输入参数的个数。plhs:原创 2012-03-02 15:27:50 · 8207 阅读 · 0 评论 -
理解和使用C++中的智能指针
使用C++一个最大的好处是它的动态性。我们可以使用new ,delete 动态分配内存和释放内存。但是有时候就会出现一些问题,如果我们忘记删除用new创建的对象,将会出现内存泄露,在长期运行的系统中,甚至一个很小的内存泄露将会造成很大的问题。所以,怎么样保证每一个new对应一个delete呢? 一个很好的办法是用C++中的auto_ptr变量。接下来讲使用智能指针来解决这个问原创 2012-02-29 13:39:23 · 711 阅读 · 0 评论 -
自定义异常类型
建立异常类 error.hpp#ifndef BANK_ERROR_HPP#define BANK_ERROR_HPP#include namespace bank {class error : public std::exception{ public: explicit error(const char*) throw();原创 2011-11-29 19:27:13 · 632 阅读 · 0 评论