关闭

【C++】由指针常量和常量指针引发的问题

今天在写一个C++程序的时候,要用到STL的set容器,而且我想让它利用自定义的排序准则来实现自动排序。而且set中元素类型是指向自定义的结构体的指针。结果运行总是出错。 下面先贴出起初的代码: #include #include using namespace std; typedef struct test_t{ int a; int b; }test; class...
阅读(3260) 评论(1)

【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 这两种形式之间没有本质上的不同...
阅读(2259) 评论(0)

【STL深入学习】SGI STL空间配置器详解(二)-第二级空间配置器

本文讲解SGI STL空间配置器的第二级配置器。 相比第一级配置器,第二级配置器多了一些机制,避免小额区块造成内存的碎片。不仅仅是碎片的问题,配置时的额外负担也是一个大问题。因为区块越小,额外负担所占的比例就越大。 额外负担是指动态分配内存块的时候,位于其头部的额外信息,包括记录内存块大小的信息以及内存保护区(判断是否越界)。要想了解详细信息,请参考MSVC或者其他malloc实现。...
阅读(2996) 评论(1)

【C++】new A和new A()的区别详解

我们在C++程序中经常看到两种new的使用方式:new A以及new A()。那么这两种究竟有什么区别呢? 调用new分配的内存有时候会被初始化,而有时候不会,这依赖于A的类型是否是POD(Plain old data)类型,或者它是否是包含POD成员、使用编译器生成默认构造函数的类。 附:POD类型 POD是Plain old data的缩写,它是一个struct或者类,且...
阅读(6703) 评论(1)

【C++面向对象】类的静态成员函数(static member functions)

一、静态成员函数的引入 在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用。而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象。类对象提供this指针给这种函数使用。这个this指针把“在成员函数中存取的非静态数据成员”绑定于“对象内对应的成员”身上。如果没有任何一个成员被直接存取,事实上就不需要this指针,因此也就不需要通过一个类对象来调用一个成...
阅读(2372) 评论(1)

【STL学习】自己动手C++编程实现hash table(散列表)

SGI STL中散列表采用链接法解决冲突。结构中维护了一个vector,vector中每一个元素称为一个桶(bucket),它包含的是一个链表的第一个节点。 下面代码展示了自己编程实现的hash table,C++模板类封装。 如有错误,还请包涵和指正(E-Mail:xiajunhust@gmail.com)! HashTable.h: //《STL源码剖析》5.7...
阅读(4481) 评论(1)

【STL学习】优先级队列Priority Queue详解与C++编程实现

优先级队列Priority Queue介绍 优先级队列是一个拥有权值观念的queue。它允许在底端添加元素、在顶端去除元素、删除元素。 优先级队列内部的元素并不是按照添加的顺序排列,而是自动依照元素的权值排列。权值最高者排在最前面。 缺省情况下,优先级队列利用一个大顶堆完成。关于堆可以参考:STL堆详解与编程实现 优先级队列以底部容器完成其所有工作,具有这种“修改某物接口,...
阅读(13537) 评论(0)

【STL学习】堆相关算法详解与C++编程实现(Heap)

堆简介 堆并不是STL的组件,但是经常充当着底层实现结构。比如优先级队列(Priority Queue)等等。 堆是一种完全二叉树,因此我们可以用数组来存储所有节点。在这里的实现中,采用了一个技巧:将数组中索引为0的元素保留,设置为极大值或者为极小值(依据大顶堆或者小顶堆而定)。那么当某个节点的索引是i时,其左子节点索引为2*i,右子节点索引为2*i+1.父节点是i/2(这里/表示高斯...
阅读(15715) 评论(0)

【STL深入学习】SGI STL空间配置器详解(一)-第一级空间配置器

一、SGI STL配置器简介 SGI STL的配置器与众不同,它与标准规范不同。如果要在程序中明确使用SGI配置器,那么应该这样写: vector iv;他的名字是alloc,而且不接受任何参数。标准配置器的名字是allocator,而且可以接受参数。 SGI STL的每一个容器都已经指定了缺省配置器:alloc。我们很少需要自己去指定空间配置器。比如vector容器的声明:...
阅读(4814) 评论(3)

【C++】错误处理和异常处理

C++语言本身或标准程序库所抛出的所有异常,都派生自基类exception。这是其他数个标准异常类别的基类,它们共同构成一个类体系: 图一 标准异常阶层体系 这些标准异常类别分为三组: (1)语言本身所支持的异常 此类异常用以支撑某些语言特性。主要包括: bad_alloc:new操作失败会抛出。 bad_cast:执行期间加在一个引用上面的动态性型...
阅读(11799) 评论(0)

【C++ STL学习之八】逆向迭代器reverse_iterator

对于逆向迭代器,很重要的一点是需要弄清楚逻辑位置和实际位置二者的区别。 下图显示了逆向迭代器的位置和所指的数值: 可以发现,逆向迭代器所指位置(实际位置)和所代表的的数值(逻辑位置或数值)是不同的。C++这么做是有其原因的。导致这个行为的原因是区间的半开性。为了能够制定容器内的所有元素,我们必须运用最后一个元素的下一个位置。但是对于reverse迭代器而言,这个位置位于第一...
阅读(1988) 评论(0)

【C++深入探索】Copy-and-swap idiom详解和实现安全自我赋值

任何管理某资源的类比如智能指针需要遵循一个规则(The Rule of Three): 如果你需要显式地声明一下三者中的一个:析构函数、拷贝构造函数或者是拷贝赋值操作符,那么你需要显式的声明所有这三者。 拷贝构造函数和析构函数实现起来比较容易,但是拷贝赋值操作符要复杂许多。 它是怎么实现的?我们需要避免那些误区? 那么Copy-and-swap就是完美的解决方案。而且可以很好地帮助拷贝赋值...
阅读(5234) 评论(2)

【C++】类的成员初始化表与构造函数内赋值操作

我们常常在初始化类数据成员的时候,对使用初始化表和在构造函数中十分困惑,这二者有什么区别呢?我们应该如何选择呢? 先举个简单的例子,看下面的两段代码: 代码A: inline Account::Account(const char* name,doubl opening_bal) ::_name(name), _balance(opening_bal) { _a...
阅读(3690) 评论(3)

【C/C++】异或操作巧妙实现两个数的交换操作

今天在看OpenGL加载TGA格式图像用作纹理的代码时,看到关于RGB(A)顺序转换的一行代码时,捉一开始感到很困惑,后来想了想,就是实现交换操作。 原始代码: texture->imageData[cswap] ^= texture->imageData[cswap+2] ^= texture->imageData[cswap] ^= texture->imageData[cswap+2...
阅读(2926) 评论(4)

【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_...
阅读(2311) 评论(0)
36条 共3页1 2 3 下一页 尾页
    个人资料
    • 访问:1738209次
    • 积分:14181
    • 等级:
    • 排名:第965名
    • 原创:122篇
    • 转载:15篇
    • 译文:6篇
    • 评论:937条
    博客专栏
    公告
    博客已迁移至:http://xiajunhust.github.io/