C/C++
没有昵称阿
计算机专业同学的充电站,专注分享硬核CS学习路线、大学生成长干货。有些道理如果早一点知道,就能少走很多弯路~~~
展开
-
【C++】由指针常量和常量指针引发的问题
今天在写一个C++程序的时候,要用到STL的set容器,而且我想让它利用自定义的排序准则来实现自动排序。而且set中元素类型是指向自定义的结构体的指针。结果运行总是出错。下面先贴出起初的代码:#include #include using namespace std;typedef struct test_t{ int a; int b;}test;class原创 2013-07-18 21:30:20 · 3810 阅读 · 1 评论 -
【C++】类的成员初始化表与构造函数内赋值操作
我们常常在初始化类数据成员的时候,对使用初始化表和在构造函数中十分困惑,这二者有什么区别呢?我们应该如何选择呢?先举个简单的例子,看下面的两段代码:代码A:inline Account::Account(const char* name,doubl opening_bal) ::_name(name), _balance(opening_bal){ _a原创 2012-08-17 20:16:56 · 4401 阅读 · 3 评论 -
【C++ STL学习之八】逆向迭代器reverse_iterator
对于逆向迭代器,很重要的一点是需要弄清楚逻辑位置和实际位置二者的区别。下图显示了逆向迭代器的位置和所指的数值:可以发现,逆向迭代器所指位置(实际位置)和所代表的的数值(逻辑位置或数值)是不同的。C++这么做是有其原因的。导致这个行为的原因是区间的半开性。为了能够制定容器内的所有元素,我们必须运用最后一个元素的下一个位置。但是对于reverse迭代器而言,这个位置位于第一原创 2012-11-09 10:19:58 · 5878 阅读 · 0 评论 -
【C++深入探索】Copy-and-swap idiom详解和实现安全自我赋值
任何管理某资源的类比如智能指针需要遵循一个规则(The Rule of Three):如果你需要显式地声明一下三者中的一个:析构函数、拷贝构造函数或者是拷贝赋值操作符,那么你需要显式的声明所有这三者。拷贝构造函数和析构函数实现起来比较容易,但是拷贝赋值操作符要复杂许多。它是怎么实现的?我们需要避免那些误区?那么Copy-and-swap就是完美的解决方案。而且可以很好地帮助拷贝赋值翻译 2012-08-30 21:40:30 · 9886 阅读 · 4 评论 -
判断C语言变量名是否合法
C语言实现判断变量名是否合法: 代码: #include#include #includeint main(){ int n,i,flag,len,flag1; char *ss[]={"auto","break","case","char","const","continue","default","do","double","else","enum","原创 2010-07-07 22:40:00 · 14344 阅读 · 2 评论 -
【C++面向对象】类的大小以及虚继承
先看下面一段代码:#include using namespace std;class X{};class Y:public virtual X{};class Z:public virtual X{};class A:public Y,public Z{};int main(){ cout << "sizeof(X) : " << sizeof(X) << endl原创 2012-05-18 21:33:42 · 2566 阅读 · 1 评论 -
【C/C++】异或操作巧妙实现两个数的交换操作
今天在看OpenGL加载TGA格式图像用作纹理的代码时,看到关于RGB(A)顺序转换的一行代码时,捉一开始感到很困惑,后来想了想,就是实现交换操作。原始代码:texture->imageData[cswap] ^= texture->imageData[cswap+2] ^=texture->imageData[cswap] ^= texture->imageData[cswap+2原创 2012-06-08 19:48:50 · 4143 阅读 · 3 评论 -
【C++面向对象】类的数据成员:绑定、布局和存取
一、数据成员的绑定(The binding of a data member)先看一段代码://某个头文件,从某处含入extern float x;class Point3d{public: Point3d(float,float,float); float X() { return x; } void X(float new_x) { x = new_原创 2012-05-19 21:34:08 · 3009 阅读 · 0 评论 -
【C++ STL学习之四】容器list深入学习
一、list基础List使用一个双向链表来管理元素。图一显示了list的结构。图一 list的结构任何型别只要具备赋值和可拷贝两种性质,就可以作为list的元素。二、list的功能list的内部结构和vector和deque截然不同,在很多方面都表现不同:1、list不支持随机存取。所及既不提供下表操作符,也不提供at()函数。2、任何位置上插入元素删除原创 2012-04-13 20:46:53 · 4966 阅读 · 1 评论 -
【C++ STL学习之七】STL算法之find和find_if
一、find()算法template InputIterator find ( InputIterator first, InputIterator last, const T& value ) { for ( ;first!=last; first++) if ( *first==value ) break; return first; }返回区间[first,e原创 2012-04-23 20:49:52 · 29697 阅读 · 1 评论 -
【C++】错误处理和异常处理
C++语言本身或标准程序库所抛出的所有异常,都派生自基类exception。这是其他数个标准异常类别的基类,它们共同构成一个类体系:图一 标准异常阶层体系这些标准异常类别分为三组:(1)语言本身所支持的异常此类异常用以支撑某些语言特性。主要包括:bad_alloc:new操作失败会抛出。bad_cast:执行期间加在一个引用上面的动态性型原创 2012-11-27 18:21:46 · 20591 阅读 · 0 评论 -
【STL学习】堆相关算法详解与C++编程实现(Heap)
堆简介堆并不是STL的组件,但是经常充当着底层实现结构。比如优先级队列(Priority Queue)等等。堆是一种完全二叉树,因此我们可以用数组来存储所有节点。在这里的实现中,采用了一个技巧:将数组中索引为0的元素保留,设置为极大值或者为极小值(依据大顶堆或者小顶堆而定)。那么当某个节点的索引是i时,其左子节点索引为2*i,右子节点索引为2*i+1.父节点是i/2(这里/表示高斯原创 2013-01-29 19:33:56 · 24404 阅读 · 6 评论 -
【C++学习】C++中的强制转换
C++中的强制转换1、旧风格的强制换转换C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(exdivssion) // cast exdivssion to be of type T 这两种形式之间没有本质上的不同转载 2013-06-28 21:16:43 · 2532 阅读 · 0 评论 -
【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
通过我这些天用C++读写bmp图像的经历,摸索再摸索,终于对bmp文件的结构、操作有了一定的了解,下面就大概介绍bmp图片纯C++的读取、旋转和保存的实现过程。要用C++读取bmp图片文件,首先要弄清楚bmp格式图片文件的结构。可以参考这篇文章:http://blog.csdn.net/xiajun07061225/article/details/5813726有几点需要注意的是:在读原创 2011-07-26 10:15:31 · 123440 阅读 · 91 评论 -
【C++ STL学习之五】容器set和multiset
一、set和multiset基础set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。需要包含头文件:#include set和multiset都是定义在std空间里的类模板:template<class _Kty, class _Pr = less, class _Alloc = allocator原创 2012-04-14 09:35:01 · 77236 阅读 · 6 评论 -
【STL深入学习】SGI STL空间配置器详解(二)-第二级空间配置器
本文讲解SGI STL空间配置器的第二级配置器。相比第一级配置器,第二级配置器多了一些机制,避免小额区块造成内存的碎片。不仅仅是碎片的问题,配置时的额外负担也是一个大问题。因为区块越小,额外负担所占的比例就越大。额外负担是指动态分配内存块的时候,位于其头部的额外信息,包括记录内存块大小的信息以及内存保护区(判断是否越界)。要想了解详细信息,请参考MSVC或者其他malloc实现。原创 2013-04-17 11:10:50 · 3989 阅读 · 1 评论 -
【STL深入学习】SGI STL空间配置器详解(一)-第一级空间配置器
一、SGI STL配置器简介SGI STL的配置器与众不同,它与标准规范不同。如果要在程序中明确使用SGI配置器,那么应该这样写:vector iv;他的名字是alloc,而且不接受任何参数。标准配置器的名字是allocator,而且可以接受参数。SGI STL的每一个容器都已经指定了缺省配置器:alloc。我们很少需要自己去指定空间配置器。比如vector容器的声明:原创 2012-12-02 16:17:20 · 6795 阅读 · 3 评论 -
【C++】new A和new A()的区别详解
我们在C++程序中经常看到两种new的使用方式:new A以及new A()。那么这两种究竟有什么区别呢?调用new分配的内存有时候会被初始化,而有时候不会,这依赖于A的类型是否是POD(Plain old data)类型,或者它是否是包含POD成员、使用编译器生成默认构造函数的类。附:POD类型POD是Plain old data的缩写,它是一个struct或者类,且翻译 2013-04-13 11:24:19 · 19962 阅读 · 3 评论 -
【C++面向对象】类的静态成员函数(static member functions)
一、静态成员函数的引入在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用。而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象。类对象提供this指针给这种函数使用。这个this指针把“在成员函数中存取的非静态数据成员”绑定于“对象内对应的成员”身上。如果没有任何一个成员被直接存取,事实上就不需要this指针,因此也就不需要通过一个类对象来调用一个成原创 2013-04-10 15:13:03 · 4926 阅读 · 1 评论 -
【STL学习】自己动手C++编程实现hash table(散列表)
SGI STL中散列表采用链接法解决冲突。结构中维护了一个vector,vector中每一个元素称为一个桶(bucket),它包含的是一个链表的第一个节点。下面代码展示了自己编程实现的hash table,C++模板类封装。如有错误,还请包涵和指正(E-Mail:xiajunhust@gmail.com)!HashTable.h://《STL源码剖析》5.7原创 2013-04-01 15:52:03 · 6607 阅读 · 1 评论 -
【STL学习】优先级队列Priority Queue详解与C++编程实现
优先级队列Priority Queue介绍优先级队列是一个拥有权值观念的queue。它允许在底端添加元素、在顶端去除元素、删除元素。优先级队列内部的元素并不是按照添加的顺序排列,而是自动依照元素的权值排列。权值最高者排在最前面。缺省情况下,优先级队列利用一个大顶堆完成。关于堆可以参考:STL堆详解与编程实现优先级队列以底部容器完成其所有工作,具有这种“修改某物接口,原创 2013-01-30 16:43:11 · 19139 阅读 · 0 评论 -
【C++ STL学习之六】STL算法之for_each
for_each()函数将调用者提供的操作施加于每一个元素身上。它既可以是非变动性算法,也可以说是变动性算法。template Function for_each (InputIterator first, InputIterator last, Function f);将函数f施加于区间[first,last)的每一个元素身上。其实现:template Function原创 2012-04-23 20:25:47 · 3698 阅读 · 0 评论 -
【C++ STL学习之三】容器deque深入学习
C++ STL容器deque和vector很类似,也是采用动态数组来管理元素。使用deque之前需包含头文件:#include 它是定义在命名空间std内的一个class template:templateclass _Ax = allocator >class deque;第一个template参数用来表示元素型别,第二个可有可无,指定内存模型。一般使原创 2012-04-10 08:55:17 · 48054 阅读 · 2 评论 -
【C++基础学习】《C++ Primer》中的“有序型”
本人在看《C++ Primer(第三版)》中文版看到类一章时,遇到了“有序型”这个概念。(Page527)原文摘录如下:作为特例,有序型的const静态数据成员可以在类体中用一常量值初始化。例如,如果决定用一个字符数组而不是string来存储账户的姓名,那么我们可以用int型的const数据成员指定数组的长度。例如://头文件class Account{ //...priva原创 2011-11-10 11:30:15 · 1773 阅读 · 0 评论 -
【C++基础学习】关于C++静态数据成员
静态类成员包括静态数据成员和静态函数成员两部分。 一、 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态转载 2011-11-10 10:51:41 · 9157 阅读 · 5 评论 -
读《C++ Primer(第三版)》的一些疑问(不断更新)
【1】Page135下列语句哪些是非法的或错误的?(b)vector *pvec1=new vector(10)(c)vector *pvec1=new vector(10)这两个有什么区别?各是对的还是错误的?解答:vector *pvec1=new vector(10)是分配原创 2011-07-10 20:57:59 · 2562 阅读 · 1 评论 -
VC++ (VS2008)里面char和LPTSTR的转换问题
在VS里面写如下代码,实现两个数的相加并且显示结果: int num1,num2,num3; char ch1[10],ch2[10],ch3[10]; GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);原创 2011-07-21 09:28:24 · 5765 阅读 · 4 评论 -
【C++基础学习】关于C++静态成员函数和变量
代码一:class Point{public: void output() { } static void init() { }};int main(){ Point pt; pt.init(); pt.output();}代码二:class Point{public: void output() { } static void init()原创 2011-10-10 19:09:36 · 4046 阅读 · 0 评论 -
【C++基础学习】二维数组的动态分配及参数传递
1. C语言动态分配二维数组(1)已知第二维char (*a)[N];//指向数组的指针a = (char (*)[N])malloc(sizeof(char *) * m);printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//N,一维数组free(a);(2)已知第一维char* a[M];转载 2011-09-27 20:52:59 · 2437 阅读 · 0 评论 -
【C++ STL学习之二】容器vector大总结
一、容器vector使用vector必须包含头文件:#include型别vector是一个定义于namespace std内的template:template<class _Ty, class _Ax = allocator >第二个参数定义内存模型。我们一般采用默认的内存模型。二、vector的功能vector模塑出一个动态数组。vector将其元复制原创 2012-04-09 08:17:26 · 6984 阅读 · 1 评论 -
【C++ STL学习之一】容器的共通能力和共通操作总结
一、C++ STL各容器有一些共通的能力其中三个最核心的能力是:(1)所有容器提供的是“value语意”而不是“reference语意”。容器进行元素的安插操作时,内部实施的是拷贝操作,存放的是元素的副本。因此容器的每一个元素必须能被拷贝。如果打算存放的对象不具备public 拷贝构造函数或者你要得不是对象的副本,那么容器元素只能是指针。(2)所有元素形成一个次序。我们可以原创 2012-04-08 20:00:11 · 3144 阅读 · 1 评论 -
【C++基础学习】const限定修饰符详解
C++中const的一个很重要的作用就是把一个对象转换成一个常量。在程序中任何改变这个值的企图会被标记为编译错误。它被称为是“只读的”。(1)const对象在定义的时候必须被初始化。未初始化的常量会引起编译错误。原因是因为常量在定义之后就不能被修改,所以必须被初始化。(2)不能将一个非const对象的指针指向一个const对象。比如下面的代码:const int原创 2012-03-30 20:05:03 · 1653 阅读 · 0 评论 -
CPU的大端模式(big endian)和小端(little endian)模式
作为一个计算机相关专业的人,我们应该在计算机组成中都学习过什么叫Little endian 和Big endian。Little endian 和Big endian 是CPU 存放数据的两种不同顺序。对于整型、长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little endian 则相反,它认为第一个字节是最转载 2012-02-26 14:05:23 · 7821 阅读 · 3 评论 -
【C++基础学习】引起类模板被实例化情形总结
在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化。并不是每次使用一个类都要求知道该类的定义。(1)声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义。例如:class Matrix;Matrix *pm;//不需要类的定义void inverse(Matrix &);//也不需要类原创 2012-02-17 19:31:30 · 3366 阅读 · 3 评论 -
【C++基础学习】C++中union结构
C++ union结构式一种特殊的类。它能够包含访问权限、成员变量、成员函数(可以包含构造函数和析构函数)。它不能包含虚函数和静态数据变量。它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来。Union中得默认访问权限是public。在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通原创 2012-02-26 13:54:03 · 21860 阅读 · 3 评论 -
【C++基础学习】C++引用参数与指针参数
引用和指针参数,这两种参数都允许函数修改实参,也都允许有效地向函数传递大型类对象。那么,怎么样决定把函数参数声明成引用还是指针呢?引用必须被初始化为指向一个对象,而且一旦初始化了,就不能指向其他对象。而指针可以指向一系列不同的对象也可以什么都不指向。因为指针可能指向一个对象或者没有任何对象,所以函数在确定指针实际指向一个有效地对象之前不能安全地解引用一个指针。例如:class X;原创 2011-08-23 08:48:44 · 4856 阅读 · 0 评论