
C++
文章平均质量分 77
honeyCR
这个作者很懒,什么都没留下…
展开
-
explicit、implicit关键字详解
这几天复习遇见这个关键字,有点疑惑,总结一下。我们首先需要知道,explicit只能用来修饰只有一个参数的构造函数。它的作用是表明该构造函数是显式的, 而非隐式的,跟它对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。那么它们的作用是什么呢?我们通过代码看一下:class CxString // 没有使用explicit...原创 2018-08-22 18:42:05 · 4585 阅读 · 0 评论 -
C++中四种类型转化
我们都知道: C中的强制类型转换(Type Cast)很简单,不管什么类型的转换都是: Type b = (Type)a而C++中有四种转换类型如下: static_cast ,const_cast ,dynamic_cast,reinterpret_cast 我们来详细了解一下:1.static_cast静态转换(在编译期间处理)类似于C风格的强制转换最常用的类型转换符,...原创 2018-08-04 09:38:15 · 767 阅读 · 0 评论 -
交换排序---冒泡、快速、归并排序
一、交换排序 利用交换元素的位置进行排序的方法称作交换排序。常用的交换排序的方法有冒泡排序和快速排 序。快速排序是一种分区交换排序方法。二、冒泡排序原创 2018-03-04 22:10:12 · 470 阅读 · 0 评论 -
选择排序--选择排序和堆排序
选择排序:基本思想:每一趟(第i趟,i=0,1,…,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素。待到第n-2趟做完,待排序元素集合中只剩下1 个元素,排序结束。一、选择排序每一次在一组数中选最大的放到最后,然后再在剩余的数中选次大的数放到倒数第二个位置,直到这组数选完为止;(以升序为例) void SelectSort(int *array,...原创 2018-03-03 22:24:34 · 319 阅读 · 0 评论 -
插入排序--直接插入与希尔排序
插入排序:每一步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的合适位置上去,直到元素全部插完位置。一、直接插入排序 基本思想:当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插...原创 2018-03-03 22:02:40 · 251 阅读 · 0 评论 -
C++实现红黑树
一、红黑树的性质红黑树也是二叉搜索树,它的每个节点增加了一个单位用来表示颜色,可以是Red也可以是Black,通过对任意一条根到叶子节点的颜色来约束,红黑树保证最长路径是最短路径的两倍,因此近似平衡。红黑树的性质: 1、每个节点不是红色就是黑色 2、树的根节点是黑色 3、如果一个节点是红色,则它的两个孩子节点是黑色的(没有连续的红色) 4、 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均...原创 2018-02-18 13:37:11 · 289 阅读 · 0 评论 -
AVL树
AVL树一、AVL树的性质AVL树又称平衡搜索二叉树. AVL树的性质: 1、左子树和右子树的高度差的绝对值不大于1; 2、树中的每个左子树和右子树都是AVL树; 3、树中的每个节点都有平衡因子(_bf),每个平衡因子都等于其右子树的高度减去左子树的高度;如下图:看一下AVL树的节点结构:template<class K,class V>struct AVLTreeNode{ A...原创 2018-02-17 14:09:19 · 316 阅读 · 0 评论 -
二叉树线索化以及线索化前序、中序、后序遍历
二叉树线索化以及线索化前序、中序、后序遍历前面已经对二叉树的创建与建立有了一定了解,那二叉树的线索化又是什么呢?二叉树虽然是非线性结构,但二叉树的遍历却为二叉树的节点导出了一个线性序列。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节原创 2017-12-05 20:45:22 · 1625 阅读 · 0 评论 -
循环队列与链式队列的实现
循环队列与链式队列的实现我们了解一下队列:是运算受限的线性表。是一种先进先出(First In First Out ,简称FIFO)的线性表。只允许在表的一端front进行插入,而在另一端rear进行删除。 队首(front) :允许进行删除的一端称为队首。 队尾(rear) :允许进行插入的一端称为队尾。我用两种方式实现了队列,一种是数组存储,一种是单链表。如下,有入队,原创 2017-11-25 22:58:09 · 1536 阅读 · 0 评论 -
函数指针与仿函数
函数指针在平常的C/C++代码编程中, 我们经常会碰到函数指针(Function Pointer)这个概念,函数指针,顾名思义,指向函数入口的指针。 像我们平常使用的指向数组的指针,我们可以传递数组的地址。函数指针也一样,我们用代码演示一下具体用法:#include<iostream> using namespace std;typedef void(*func)(i...原创 2018-08-04 16:32:56 · 1682 阅读 · 0 评论 -
C/C++的内存分配?栈和堆的区别?为什么栈快?
一个由 C/C++ 编译的程序占用的内存分为以下几个部分 :栈区( stack ) ——由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈;堆区( heap )——一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。分配方式类似于链表;全局区(静态区)(static)——存放全局变量、静态数据。初始化的...原创 2018-08-05 09:41:25 · 9039 阅读 · 2 评论 -
this指针详解
什么是this指针this是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。一个对象的this指针并不是对象本身的一部分,其不会影响sizeof(对象)的结果。this指针的用处this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。 也就是...原创 2018-08-01 14:49:33 · 1862 阅读 · 0 评论 -
volatile关键字详解
介绍volatile,类似于我们熟知的const,也是一个类型修饰符。volatile的主要作用是:作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 简单地说,就是防止编译器对代码进行优化,保证内存可见性。原因volatile的作用也可以说是:提示编译器该对象的值有可能在编译器未监测的情况下被改变。 这样,编译器就不会去假设这个变量的值了。精确...原创 2018-08-16 17:07:28 · 222 阅读 · 0 评论 -
struct和class的区别
面试中觉得经常会问到class和struct的区别,今天整理一下。如果说class可以继承,而struct不可以继承,这是完全错误的。在C++中,这两个关键词并没有大的区别,仅在细节上有些不同。字面上的区别 (1)在字面上struct是structure的缩写,通常叫做”结构体”,在C语言里用于将多种数据、多个变量组织在一起,便于表达比较复杂的数据类型,在C++中为了兼容C语言保留了该...原创 2018-08-17 22:27:00 · 1326 阅读 · 0 评论 -
32位和64位机数据类型的大小?32位指针为什么是4个字节?
今天在优快云论坛看到很多讨论int类型大小由什么决定,争论的由机器字长决定还是编译器决定,int类型比较特殊,具体的字节数应该是同机器字长和编译器都有关。C、C++标准中只规定了某种类型的最小字节数(防止溢出)。32位系统和64位有什么区别?通常的64位技术是相对32位而言的,这个位数指的是CPU GPRs(General-Purpose register通用寄存器)的数据宽度为64...原创 2018-08-03 15:56:07 · 11752 阅读 · 4 评论 -
对指针和引用的理解?指针和引用的区别?
对指针和引用的理解?指针和引用的区别?原创 2018-08-07 16:09:37 · 1943 阅读 · 0 评论 -
C++设计一个类:不能被继承
C++如何设计一个不能被继承的类?我们首先想到,不能被继承,那把构造函数和析构函数设计成私有的不就行了,这样的话子类不能访问父类的构造函数和析构函数,也就无法继承了。然而这样一来,这个类在其他地方也就不能实例化了,没有存在的意义了。这时候我们应该想到静态方法,我们可以通过静态方法来返回类的实例,然后通过另一个静态方法来释放该类对象。看如下代码:class A{public:...原创 2018-08-02 16:53:23 · 920 阅读 · 0 评论 -
C++与C的区别
C++和C的区别C语言是面向过程编程,C++是面向对象编程面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了。 面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题步骤中的行为。 面向过程编程的性能比面向对象高,因为类调用的时候需要实例化,开销比较大,比较消耗...原创 2018-08-06 21:46:44 · 1719 阅读 · 1 评论 -
设计一个类:只能在堆上创建对象?只能在栈上创建对象?只能创建一个对象?
在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数;动态建立类对象,是使用new运算符将对象建立在堆空间中。这个过程分为两步,第一步是执...原创 2018-08-01 18:03:39 · 2402 阅读 · 1 评论 -
C++内存管理分析
malloc/calloc/realloc的区别?1. malloc 函数原型: void *malloc(size_t size); 函数功能: malloc()在内存的动态存储区中分配一块长度为size字节的连续区域。参数size为需要的内存空间的长度,返回该区域的地址。 区别: malloc不能初始化所分配的内存空间,需要用memset,而函数calloc能初始化。如果这部...原创 2018-08-01 17:16:50 · 880 阅读 · 0 评论 -
对称矩阵、稀疏矩阵及矩阵的逆置与加法
矩阵之对称矩阵、稀疏矩阵与矩阵逆置一、对称矩阵及压缩存储我们先了解一下压缩矩阵,对称矩阵存储时只需要存储上三角或下三角的数据,所以最多存储n*(n+1)/2个数据。我们就知道了我们需要空间的大小。代码如下:#includeusing namespace std;#include//对称矩阵templateclass SymmetricMatrix{public:原创 2017-11-25 10:35:59 · 1559 阅读 · 0 评论 -
二叉树面试题-镜像与判断是否为完全二叉树
二叉树部分面试题关于二叉树的一些面试题在下面的文章已经写过了,点击打开链接在这里做一些补充。原创 2017-12-02 13:54:27 · 334 阅读 · 0 评论 -
继承(加深)-构造函数调用顺序与函数重定义
从基类派生子类时,基类的构造函数不能继承到派生类中,因此我们在定义派生类的构造函数时除了对1、派生类的构造函数原创 2017-10-11 11:48:58 · 582 阅读 · 0 评论 -
泛型编程与函数模板
考虑一个问题:写一个通用的加法程序,如下:int Add(int left, int right){ return left + right;}double Add(double left, double right){ return left + right;}……我们得把每种情况列出来,显然十分麻烦。C++为我们提供了一种解决方式,叫泛型编程(编写与类型无关的逻辑原创 2017-10-14 16:46:57 · 650 阅读 · 0 评论 -
使用模板实现冒泡法
使用模板实现冒泡法之前的冒泡法可以排序一种类型,学习模板类后,我们可以使用模板实现各种类型的比较,以及需要比较sz个字符代码如下:#includeusing namespace std;templatestruct Less //降序{ bool operator()(const T& left,const T& right) { r原创 2017-10-28 19:09:05 · 488 阅读 · 0 评论 -
迭代器标准容器List
迭代器实现双向链表//完成标准容器List#includeusing namespace std;#pragma oncetemplatestruct ListNode{ ListNode(const T& data = T()) : _pPre(0) , _pNext(0) , _data(data) {} ListNode* _pPre; ListNode* _原创 2017-10-28 18:03:42 · 234 阅读 · 0 评论 -
继承(基础)
继承,顾名思义,按照法律或遵照遗嘱接受死者的财产、职务、头衔、地位等。也可以从生活的角度来理解,有一个孩子,他肯定会遗传父亲或者母亲的一些特征,也就相当于继承了他们的一些特点,再结合自己本身的特点,形成一个完整的个体。而C++四个特性抽象、封装、继承、多态中的继承是什么呢?作用又是什么呢?我们一起来了解一下。1.继承的概念与作用 继承是面向对象程序设计使代码可以复用的最重要原创 2017-10-09 18:06:28 · 333 阅读 · 0 评论 -
浅拷贝与深拷贝并实现String
1.什么是浅拷贝,里面存在什么问题?如果已定义好一个类,如果类中只有int、double、char、bool这类基本类型的变量,由于基本变量的所占空间是已知的,所以在编译时编译器就可确定所需内存大小而进行分配(静态分配内存),对象a和对象b他们的变量存在于各自的内存块中(对象内存空间),浅拷贝后a的所有变量都被拷贝,如果a中的变量值被修改不会影响b内的变量值。 但假如这个类是个原创 2017-09-23 20:40:32 · 287 阅读 · 0 评论 -
简单介绍函数参数缺省与函数重载
简单介绍函数参数缺省与函数重载1、函数参数缺省我们先来看一段代码:#include#includeint ADD(int a = 0, int b = 0){ return a + b;}int main(){ printf("%d\n", ADD()); printf("%d\n", ADD(10)); printf("%d\n", ADD(10,20));原创 2017-08-03 10:31:53 · 689 阅读 · 0 评论 -
C++完成复数类的运算符重载
复数类的运算符重载 运算符重载指对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 对于复数类,有实部和虚部两部分,因此我们对于加减乘除要列式计算。程序如下:#includeusing namespace std;class Complex{public: Complex(double real = 0.0, double image原创 2017-09-15 19:58:21 · 1065 阅读 · 0 评论 -
构造函数、析构函数是否要定义为虚函数?
1、基类的构造函数不能为虚函数,因为对象不完整2、不要在构造函数和析构函数里面调用虚函数,可能会发生未定义的行为eg:构造派生类对象时,首先调用基类构造函数初始化对象的基类部分。在执行基类构造函数时,对象的派生类部分是未初始化的。实际上,此时的对象还不是一个派生类对象。析构派生类对象时,首先撤销/析构他的派生类部分,然后按照与构造顺序的逆序撤销他的基类部分。因此,在运行构造原创 2017-10-14 15:37:15 · 978 阅读 · 0 评论 -
迭代器实现Vector
迭代器是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。迭代器提供一些基本操作符:*、++、==、!=、=。这些操作和C/C++“操作array元素”时的指针接口一致。不同之处在原创 2017-10-23 21:10:13 · 849 阅读 · 0 评论 -
利用虚函数设计统一的公共接口(求体积与表面积)
学习了虚函数,我们可以考虑,若要满足相关对象的需求,要求设计出一组实现公共功能的函数。我们可以将这些函数作为基类的虚函数(或纯虚函数),他们定义了一个统一的公共接口。再由该基类派生出若干子类,在各个子类中实现这些虚函数。简称:“一个接口,多种方式”。我们来看一个例子:编写一个程序计算正方体、球体和圆柱体的表面积和体积。原创 2017-10-12 21:50:20 · 2413 阅读 · 0 评论 -
二叉树的遍历(递归与非递归)
二叉树的遍历1、前序遍历判断节点是否为空,如果不为空,先访问根节点,再访问左子树,最后访问右子树;递归实现在上一篇文章已经做了讨论。如下:void PreOrder() { _PreOrder(_pRoot); cout << endl; }void _PreOrder(PNode& pRoot) { if (pRoot == NULL) ret原创 2017-11-30 09:25:46 · 215 阅读 · 0 评论 -
栈的应用之括号匹配
栈的应用之括号匹配首先我们来分析都有什么情况1、右括号比左括号多 eg:(()))[b]{c}2、左括号比右括号多 eg:(()[b]{c}3、括号不匹配 eg:()([)){abc}4、括号匹配成功 eg:(()){c}[ab]回想一下栈的特性,后进先出。我们可以这原创 2017-11-20 14:20:29 · 840 阅读 · 0 评论 -
C++实现顺序表与链表
C++实现顺序表与链表一、顺序表之前已经对顺序表有了了解,需要注意的是读者如果疑惑以下代码没有实现头插与头删,是因为代码中任意插入与删除这两个函数可以实现此功能。下面有测试代码,读者也可以自行测试。代码如下:#includeusing namespace std;#includetypedef int DataType;class SeqList{public:原创 2017-11-05 22:31:22 · 937 阅读 · 0 评论 -
C++单链表面试题
下面是C++中一些常见的单链表面试题,文中皆是无头单链表。如下:我们必须构建节点,为了方便测试,我只写了尾插函数。#include#include#includeusing namespace std;typedef struct Node{ Node(const int& data) : _data(data) , _pNext(NULL) {} int _data原创 2017-11-19 18:07:21 · 1461 阅读 · 0 评论 -
二叉树的创建与相关操作
二叉树的创建与相关操作1、二叉树:是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。如图: 2、二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。3、二叉树的第i层至多有2^(i-1)个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二原创 2017-11-27 17:07:28 · 560 阅读 · 1 评论 -
栈和队列及模拟实现
1、栈栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据。先进入的数据被压入栈底,最后的数据在栈顶;需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。结构比较简单,基本操作如下:#pragma once#includeusing namespace st原创 2017-11-04 17:56:32 · 350 阅读 · 0 评论 -
智能指针
智能指针智能指针:原创 2017-11-04 14:49:14 · 240 阅读 · 0 评论