
C++
文章平均质量分 73
vgxpm
这个作者很懒,什么都没留下…
展开
-
如何正确为函数参数中的指针动态分配内存
这里先介绍一种常见的错误分配方法:void GetMemory(char *p){ p = (char *)malloc(num);}void FreeMemorry(char *p){ p = NULL; free(p);}int main(){ char *str = NULL; GetMemorr原创 2013-09-13 22:19:16 · 2723 阅读 · 0 评论 -
翻译:怎样理解C++ 11中的trivial和standard-layout---An answer from stackoverflow
本文转自:http://www.cnblogs.com/tingshuo/archive/2013/03/28/2986236.html上一篇译文中,我们了解到C++中的Aggregates和POD类型,那么在C++ 11中这些定义会有怎样的改变呢,什么是trivial和standard-layout类型呢?相信在这篇译文中,可以找到你想要的答案----------------转载 2015-08-10 21:53:29 · 1152 阅读 · 1 评论 -
翻译:怎样理解C++中的Aggregate和POD类型---An answer from stackoverflow
本文转载自:http://www.cnblogs.com/tingshuo/archive/2013/03/25/2981197.htmlC++ 11标准中统一了初始化语法,在了解这些变化之前,我们有必要对Aggregate类型和POD类型有所了解,看到stack overflow上有篇不错的文章(原文),对Aggregate、POD和C++ 11中的变化有详尽的解释,感觉非常不错转载 2015-08-10 21:38:52 · 935 阅读 · 0 评论 -
二维数组作为参数传递问题
本文转载自:http://blog.youkuaiyun.com/liuzhanchen1987/article/details/7712640int a[2][2]={ {4, 6}, {9, 11} };我定义了这样一个数组,我想把这个数组作为参数,传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做? 第一种方式是直接传递二维数组,但是必须标明第二维的值,转载 2015-08-25 21:51:26 · 689 阅读 · 0 评论 -
STL priority_queue用法
本文转自:http://www.cnblogs.com/Lyush/archive/2013/01/07/2849164.htmlpriority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue用法相似的pri转载 2015-08-27 22:57:57 · 529 阅读 · 0 评论 -
memcpy和strcpy区别以及它们的效率分析
1、首先介绍这两个函数的原型: #include char *strcpy( char *to, const char *from ); #include void *memcpy( void *to, const void *from, size_t count );从以上两个函数的参数类型和返回类型,可以看出两个函数的第一个不同点:a、strcpy只能应用原创 2015-08-13 17:46:21 · 12234 阅读 · 0 评论 -
推荐!国外程序员整理的 C++ 资源大全
关于 C++ 框架、库和资源的一些汇总列表,由 fffaraz 发起和维护。内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。 标准库C++标准库,包括了STL容器,算法和函数等。C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。Standard Te转载 2015-08-13 21:31:42 · 1004 阅读 · 0 评论 -
二叉树创建、删除、(递归/非递归)先序(中序/后序)遍历
#include #include using namespace std;typedef struct Node{int data;struct Node* pLeft;struct Node* pRight;}*pNode,node;typedef struct BitTree{pNode* pRoot;}*pBitTree;/* run原创 2015-07-21 12:15:16 · 807 阅读 · 0 评论 -
快速排序
1、算法介绍(直接百度吧。。。):设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。对排序数组进行排序,需要经过n趟快速排序,一趟快速排序的算法如下:原创 2015-07-21 16:35:36 · 607 阅读 · 0 评论 -
二分查找递归和非递归实现
1、二分查找(折半查找)算法描述:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。该算法优点是比较次数少,查找速度快,平均性能好;原创 2015-07-21 21:59:27 · 640 阅读 · 0 评论 -
归并排序
1、归并排序算法描述:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:取待排序区间a[left~right]的中间点mid作为分隔点,将中间点左边序列(lef原创 2015-07-21 23:54:00 · 802 阅读 · 0 评论 -
堆排序实现
1、堆排序算法描述:(1)定义n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):1)ki=号。//k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点2)若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键原创 2015-07-22 17:11:50 · 1150 阅读 · 0 评论 -
学习C++11之引用
1、左值引用左值引用只能绑定左值,不能绑定右值.如下:int x = 1;int &y = x; //绑定左值,正确int &z = 2; //绑定右值2,编译错误但是可以将右值绑定到一个const左值引用(这是一个例外)如: //右值绑定到const左值引用int const &i = 28;原创 2015-08-04 00:39:25 · 1813 阅读 · 0 评论 -
实现简单String类
1、实现String类,关键是重载赋值运算符的解法,下面先分析赋值运算符函数的关键点:1)是否把返回值的类型声明为该类型的引用;2)是否把传入的参数的类型声明为常量引用,若传入的参数不是引用而是实例,则从形参到实参会调用一次复制构造函数,而声明为const,是保证不改变实参;3)在赋值新值之前,是否释放实例自身之前已有的内存,否则容易出现内存泄漏;4)是否判断传入的参数和当前实例是原创 2015-07-23 23:16:17 · 779 阅读 · 0 评论 -
关于类静态成员变量指针通过动态分配的内存如何回收的探讨
一个类假如存在一个静态成员变量指针,在以下几种情况下动态分配内存,该如何回收内存:1)在外部函数中动态分配内存,代码如下:test.cppclass Test{public: static char* m_pSZ;};char* Test::m_pSZ = NULL;void testAlloc(){ Test::m_pSZ = new char[16]原创 2015-07-25 00:54:11 · 4127 阅读 · 0 评论 -
valgrind的使用
Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固。转载 2015-07-24 21:14:38 · 741 阅读 · 0 评论 -
vector中erase用法注意事项
转载自:http://blog.youkuaiyun.com/daofengdeba/article/details/7865229以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错。今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性。erase的函数转载 2015-10-06 22:43:00 · 742 阅读 · 0 评论 -
C语言中可变参数的用法
C语言中可变参数的用法出处:yourblog[ 2005-07-21 10:16:32 ]作者:yashiro责任编辑:moningfeng 我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的: int printf( const char* format, ...);转载 2015-07-15 22:19:20 · 583 阅读 · 0 评论 -
C语言函数之可变参数原理:va_start、va_arg及va_end
本文转载自:http://blog.chinaunix.net/uid-23089249-id-34493.html 作者:lingdxuyan说到C语言函数可变参数,我们最先想到的可能就是printf、scanf、printk了。在Linux-2.6.24.7内核源码里,printk函数原型如下:asmlinkage int printk(c转载 2015-07-15 22:57:36 · 626 阅读 · 0 评论 -
关于STL中的map和hash_map
转载自:http://blog.youkuaiyun.com/dongtingzhizi/article/details/8629285在网上看了一篇《详细解说STL hash_map系列》的文章(http://blog.163.com/liuruigong_lrg/blog/static/27370306200711334341781/),以及一些其他关于STL map和hash_map的资转载 2015-07-27 17:45:25 · 906 阅读 · 0 评论 -
C++new的所不知道的用法
http://www.builder.com.cn/2008/0104/696370.shtml“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针转载 2014-10-30 21:44:59 · 675 阅读 · 0 评论 -
C++中的抽象类以及接口的区别联系
一、抽象类和接口抽象类: 抽象类是特殊的类,不能被实例化(将定义了纯虚函数的类称为抽象类);除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方法。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。虽然不转载 2014-12-23 10:34:59 · 695 阅读 · 0 评论 -
C/C++中的柔性数组(可伸缩性数组)
在STL源码中的第2级空间配置器有一个联合定义如下:union obj { union obj* free_list_link; char client_data[1]; };在侯大师的详细解释下,我总算对STL的空间配置器有一个总体印象。但对以上这个联合体的设计方式始终不得其所,client_data[1]这个数组,在空间分配中根本没有使用到嘛!它的设计初衷是什么呢?原创 2015-01-19 12:08:21 · 2488 阅读 · 0 评论 -
C++中POD和trival语义
最近在看STL源码剖析,书中提到trivial destructor和no-trivial destructor,初次见到对trivial这个概念非常陌生,经过查资料,又发现一个陌生的概念POD,实在是孤陋寡闻。下面先对POD进行说明,再对trivial解释。1、POD(1) C++03标准中的定义:POD全称Plain Old Data是指C风格的struct结构体定义的数据原创 2015-01-19 11:35:32 · 1460 阅读 · 0 评论 -
函数指针以及成员函数指针1
1、 函数指针(1)函数指针申明如下:float (*my_func_ptr)(int, char *);// 为了更好地理解,强烈建议使用typedef声明.// 当函数指针是一个函数的参数时,容易造成混淆.//声明应该是typedef float (*MyFuncPtrType)(int, char *);MyFuncPtrType my_func_ptr;注:1) 函数指针原创 2015-01-19 17:24:57 · 680 阅读 · 0 评论 -
函数指针以及成员函数指针2
2、成员函数指针在C++中,普通的函数指针不能指向类中的成员函数,必须使用成员函数指针。(1) 成员函数指针声明如下:float (SomeClass::*my_memfunc_ptr)(int, char *);// 常成员函数float (SomeClass::*my_const_memfunc_ptr)(int, char *) const;注:1)以上使用了特殊操作符:翻译 2015-01-19 23:02:46 · 1364 阅读 · 0 评论 -
泛型笔记
1、在迭代器的设计上,除了提供统一的元素访问界面之外,还需要兼顾数组这种最原始容器,但是数组类型没有嵌套类型定义:value_type等 解决方法:要统一数组和容器,需要借助一个类模板和模板特例功能来统一描述迭代器与指针的特性。该模板只用来嵌套定义元素值类型,如果模板参数是一个迭代器,则提取元素值类型并重新定义;如果模板参数是一个指针,则该类模板中为指针定义其元素值类型。显然,需要模板通原创 2015-01-01 10:12:06 · 618 阅读 · 0 评论 -
泛型2
1.C++中重载函数特征除了:1)参数类型;2)参数个数;还可以有const 函数和非const 函数之分(两个函数返回值类型、参数类型、参数个数均相同)这两个函数可以认为是重载函数。2.vector是"Random Access Iterator"性质,元素存储在单一连续的内存空间,在vector中插入数据,需要移动元素,效率非常缓慢,且会使指向这个vector的其他iterators无原创 2015-01-01 10:15:21 · 741 阅读 · 0 评论 -
C++之RAII学习
C++之RAII惯用法 1、C++中的RAII全称是“Resource acquisition is initialization”,直译为“资源获取就是初始化”。RAII的好处在于它提供了一种资源自动管理的方式,当产生异常、回滚等现象时,RAII可以正确地释放掉资源。 RAII的实现原理很简单,利用stack上的临时对象生命期是程序自动管理的这一特点,将我们的资源释放操作封装原创 2015-01-01 10:05:48 · 705 阅读 · 0 评论 -
泛型、模板
1、在迭代器的设计上,除了提供统一的元素访问界面之外,还需要兼顾数组这种最原始容器,但是数组类型没有嵌套类型定义:value_type等 解决方法:要统一数组和容器,需要借助一个类模板和模板特例功能来统一描述迭代器与指针的特性。该模板只用来嵌套定义元素值类型,如果模板参数是一个迭代器,则提取元素值类型并重新定义;如果模板参数是一个指针,则该类模板中为指针定义其元素值类型。显然,需要模板通原创 2015-01-01 10:07:28 · 972 阅读 · 0 评论 -
C++之实现禁用 copy-ctor/assign operator
知道禁用 copy-ctor/assign operator 是 C++ 程序员的试金石。在看到一个开源项目时,先查看其 RAII handle class 是否禁用了 copy-ctor/assign operator(例如 Thread、Mutex、CondVar、Connection),如果没有,对其第一印象就很差了。 进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的原创 2015-01-01 09:59:56 · 3045 阅读 · 0 评论 -
C++基础学习
一、C++中类作用域(即::)的作用:1、标识作用域的级别 2、标识成员属于哪个类 3、 限定成员的作用范围 4、指出作用域的范围二、C++纯虚函数定义了纯虚函数使其成为抽象类,抽象类不可以定义对象,但可以定义纯虚函数(即可以实现改纯虚函数)。定义它的目的是其派生类中可以直接调用基类纯虚函数的某些功能。三、类模板的静态成员在包含静态成员变量的类模板中,原创 2015-01-01 10:03:55 · 1021 阅读 · 0 评论 -
C与C++代码互相访问
1、C++代码中访问C语言变量或函数首先在C语言的头文件(假设为_c.h)中,使用extern“C”{extern int a; extern int foo();},然后在C实现文件中正常定义,最后在C++文件中访问C语言变量或函数时,只需包含C语言头文件即可。如下代码所示://_c.h#ifdef __cplusplusextern "C"{ extern int a;原创 2015-06-25 20:31:14 · 982 阅读 · 0 评论 -
冒泡排序
1、从小到大冒泡排序void BubbleSort(int _array[], int num){ for( int i = num-1; i > 0; i-- ){ int flag = 1; for( int j = 0; j < i; j++ ){ if(_array[j] > _array[j+1]){ //不同点 flag = 0; int原创 2015-06-25 22:33:28 · 825 阅读 · 0 评论 -
c++继承中的内存布局(转)
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。——谈VC++对象模型(美)简.格雷程化 译译者前言一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ O转载 2015-06-10 17:39:34 · 840 阅读 · 1 评论 -
C/C++中的输入与输出及如何读取一行文本
本文转载自:http://www.cnblogs.com/xkfz007/archive/2012/08/02/2619446.html在使用C/C++进行编程的过程中,经常会遇到输入输出的问题。对于C语言中,1. 格式化输入输出。在C语言中,最常用的格式化输入输出是scanf和printf函数。和这两个函数对应的更安全的函数是fscanf和fprintf:转载 2015-07-02 11:39:17 · 4160 阅读 · 0 评论 -
基于一个简单定长内存池的实现方法详解
本文转载自:http://www.jb51.net/article/36502.htm本篇文章对一个简单定长内存池的实现方法进行了详细的分析介绍。需要的朋友参考下主要分为 3 个部分,memoryPool 是管理内存池类,block 表示内存块,chunk 表示每个存储小块。它们之间的关系为,memoryPool 中有一个指针指向某一起始 block,block 之前通过 next转载 2015-10-23 17:33:23 · 756 阅读 · 1 评论