![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 83
f2016913
一个专业小白的奋斗之路
展开
-
指针和引用
一:C++的关键字二.c++的数据类型:内置类型:c++中基本的数据类型,表示语言内部本身已定义的类型。自定义类型:表示使用class/enum/struct/union自己定义的类型。在前面的学习中我们知道,不同数据类型的集合结构体可以实现,三.命名空间,为了解决全局命名冲突(同名冲突)的问题。命名空间它相当于一个更灵活的作用域,以关键字names原创 2016-12-17 22:40:40 · 334 阅读 · 0 评论 -
链表面试题--合并两个有序的链表
问题:合并两个有序的链表,合并后结果任有序 非递归实现:两个指针分别遍历两个链表,然后比较两个指针大小,将小的节点取下放到合并后的新链表中,继续向后移动当前的指针,若两个链表至少有一个表扫描走完,走将对应的另一个表,整体添加合并后的新表中,这样就可以实现链表的合并。 方法一:ListNode* MergeList1(ListNode*l1, ListNode*l2){ if (l1原创 2017-04-21 11:53:52 · 1203 阅读 · 0 评论 -
菱形虚拟继承和多态
一.菱形继承(多继承)class AA{public: int _aa;};class BB : public AA{public: int _bb;};class CC : public AA{public: int _cc;};class DD :public BB, public CC{public: int _dd;原创 2017-02-16 00:09:34 · 850 阅读 · 0 评论 -
反转链表和查找倒数第K个节点
一:链表的逆置(反转链表) 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点: 节点的结构struct ListNode{ ListNode(const int& val) :_val(val) ,next(NULL) {} int _val; ListNode*next;};这里面我们需要三个指针分别是cur,用来顺序遍原创 2017-07-14 16:23:19 · 670 阅读 · 0 评论 -
如何定义一个只在栈/堆上生成的对象
一:首先复习下内存结构; 1:栈(stack):–由编译器自动分配释放,存放函数参数值,局部变量值等. 2:堆(heap):一般是由程序员分配释放,若程序不释放,程序结束时可能由操作系统回收 3:全局区(静态区):主要存放全局变量和静态变量,分为已初始化的全局变量和静态变量区,data区,未初始化的全局变量和静态变量区(bbs区); 4:常量区:各种常量字符 5:代码段:存放函数二进制代码原创 2017-07-13 16:57:41 · 1842 阅读 · 0 评论 -
判断链表是否带环?若带环求环的长度?求环的入口点?
一:判断链表是否带环 方法是快慢指针: 开始的时候,两个指针都指向开头,然后让快指针走两步,而慢指针每次走一步,当他们在某个点相遇则表明,这个链表带环,否则继续遍历这个链表bool IsCircle(ListNode*phead){ assert(phead); ListNode*fast =phead; ListNode*slow =phead; while(原创 2017-07-17 11:22:22 · 463 阅读 · 0 评论 -
刷题--二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像 那么什么是二叉树的镜像呢?我们其实可以从生活中得到启示,每个人早上起来都有找镜子的习惯,这样我们就会很容易想明白二叉树的镜像了, 如图两颗互为镜像的二叉树. 观察这颗二叉树我们会发现,这两颗二叉树的根节点相同,但是它们的左右两个子节点交换了位置. 步骤: 1:首先交换节点2和节点6 2:第二步:交换将节点1和节点3作为整体然后原创 2017-07-24 21:59:26 · 260 阅读 · 0 评论 -
再识智能指针
背景 为什么需要智能指针: 如果在程序中 这时我们希望有一个类来帮我们完成资源的管理,智能指针就出现了. 什么是智能指针? 分三步去理解 a:第一步:RTLL: 又称资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 简单点说就是在初始化时获取系统的资源,在析构时,释放资源.b:第二步:原创 2017-07-16 10:10:26 · 2116 阅读 · 7 评论 -
判断一颗树是不是完全二叉树
首先我们要明白完全二叉树的含义: 完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左 边,这就是完全二叉树 我们先来回顾下二叉树按层遍历,先将根节点进队列,然后判断每次这个队列是否为空,不为空,每次取队头的数据然后pop,最后再递归走其子问题,判断左子树是否为空,不为空直接入队,再判断右子树是否为空原创 2017-07-25 10:52:54 · 671 阅读 · 1 评论 -
判断一个栈的弹出序列是否为合法序列
题目: 输出两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序,假设压入栈的苏偶偶数字均不相等.例如序列1,2,3,4,5是某栈的压栈序列.序列4,5,3,2,1是该压栈序列的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 思路: 验证:#include<iostream>#include<stack>#include<assert.h>原创 2017-07-25 14:43:38 · 1533 阅读 · 0 评论 -
C语言如何模拟C++实现继承和多态
首先要明白c++的三大特性:封装,继承,多态 而这些C语言统统都没有,那么C语言如何实现继承和多态呢? C++的继承属性是通过访问限定符:public,protected,private来实现. 我们知道c++的多态必须满足两个条件:虚函数的重写已经父类的指着和引用指向子类的对象. 思路:我们知道在C语言中没有类的概念,但是却有结构体struct,默认C++中struct也是类,这样我们就可原创 2017-07-29 23:34:49 · 1770 阅读 · 0 评论 -
求两个单链表的差集和并集
题目:- 已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。 思路:指针的指针pa遍历链表A,指针pb遍历链表B,当节点的值相等,删除,提前将删除位置的下一个节点保存,然后 继续遍历原创 2017-07-27 12:07:02 · 12902 阅读 · 0 评论 -
为什么基类的析构函数定义为虚函数
前提: 1:每个析构函数只会清理自己的成员(成员函数前没有virtual)。 2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类的析构函数要定义为虚函数; 基类指针可以指向派生类的对象(多态),如果删除该指针delete[]p,就会调用该指针指向的派生类的析构函数,而派生类的对象又会自动调基类的成员函数,这样就会原创 2017-04-20 21:16:23 · 4275 阅读 · 0 评论 -
C++静态绑定和动态绑定
一:静态绑定与动态绑定 静态绑定:编译时绑定, 通过对象调用 动态绑定:运行时绑定,通过地址实现 多态–简单是意思是多种状态 静态多态:a:函数多态(重载) b:模板多态(类模板和函数模板) 动态多态: a:虚函数机制;b:RTTIclass Base{public: virtual void fun() { cout << "Base:原创 2017-04-18 19:27:40 · 3360 阅读 · 0 评论 -
链表面试题--从尾到头打印单链表
题目:输入一个链表的头结点,从尾到头打印单链表 链表结点的定义:struct LinkNode{ int val;ListNode *next;}方法一://递归实现void PrintListTailToHead(struct ListNode *head){ if (head != NULL) { if (head->next != NULL)原创 2017-04-11 20:54:06 · 678 阅读 · 0 评论 -
全网优秀的IT博客
转自:http://blog.csdn.net/gatieme 感谢分享博客导航linuxlinux全线教程–提供了Linux教程,服务器管理教程,BSD教程,还有编程语言(C/Java/Python/Perl),以及网络等全栈学习教程存储技术NoSQLFan–关注NoSQL相关的新闻与技术刘爱贵的专栏–中科院博士,长期从事存转载 2017-02-07 13:20:55 · 778 阅读 · 0 评论 -
C++对象模型
一.单继承的对象模型class Car{public: virtual void func1() { cout << "Car::func1()" << endl; } virtual void func2() { cout << "Car::func2()" << endl; }protected:原创 2017-02-16 23:51:30 · 356 阅读 · 0 评论 -
模板实现顺序表
一.模板模板就是实现与类型无关的代码,增加了代码的复用性。模板分为模板函数和模板类模板函数的格式 typedef原创 2017-02-20 10:53:06 · 463 阅读 · 0 评论 -
面试常见题之虚函数及底层的实现
一.菱形对象模型(成员函数+虚函数的覆盖)class AA{public: virtual void fun1() { cout << "AA::fun1()" << endl; }public: int _aa;};class BB :public AA{public: virtual void fun1()原创 2017-02-21 09:50:55 · 771 阅读 · 0 评论 -
【c++】模板实现vector和list
前面我们也知道模板是泛型编程的基础,是实现类型无关的代码,是一种代码复用的重要手段。一:模板实现Vector:.h文件#pragma once #include#include#includeusing namespace std;templateclass Vector{public: //构造 Vector()原创 2017-03-02 13:31:51 · 694 阅读 · 0 评论 -
智能指针
一.RAII(资源分配即初始化)就是定义一个类来进行资源的分配和释放,在构造函数完成资源的初始化,在析构函数完成资源的清理和释放。可以保证资源的正确初始化和释放。using namespace std;templateclass AA{public: AA() { cout << "AA()" << endl; } ~AA()原创 2017-02-23 11:02:52 · 488 阅读 · 0 评论 -
Sting类的实现
一.浅拷贝class String{public: String(const char *str ="") :_str(new char[strlen(str) + 1]) { strcpy(_str, str); } s2 (s1) String(const String &s) {原创 2017-02-15 15:17:06 · 2216 阅读 · 0 评论 -
c++强制类型转换
一:C语言常见的强制类型的转换有两种隐式类型的转换和强制转换所谓的隐式类型的强转就是相近的类型的转化,强制转换就是讲类型如下:int main(){ int i = 1; double j = i; printf("%d,%2f\n", i, j); //隐式 int *p = &i; int address = (int)p://强转原创 2017-02-27 17:04:38 · 542 阅读 · 0 评论 -
c++中重载,覆盖和隐藏的区别
一:重载 在c++中把几个语义,功能相似的几个函数用同一个函数名表示; 为什么要重载呢? 1:函数名被重载,函数重载便于记忆,提高了函数的易用性, 如:void fun(int );void fun(float);void fun(char);2:C++类中的构造函数需要重载机制,c++规定类的构造函数的名字必须与类名相同;那么如何实现几种不同的方法来创建对象,这就需要重载机制来实现;原创 2017-03-28 15:07:21 · 497 阅读 · 0 评论 -
面试题之--复杂链表的复制
复杂链表的复制: 复杂链表除了有一个next指针还有一个random指针 我们可以画一个图来表示 复杂链表的声明:struct ComplexNode{ ComplexNode(const int&data) :_next(NULL) , _random(NULL) , _data(data) {} ComplexNode* _next;原创 2017-04-10 13:59:50 · 481 阅读 · 0 评论 -
reserve和resize的区别
1:存储空间重分配的问题:我们知道存储空间分配的问题起源于容器对象的动态创建和连续存储的特性;因此只有连续存储的容器才可能需要运行时的存储空间分配;典型就是vector,其他连续存储容器也会部分地需要存储空间冲分配;第一种:如vector,其元素保存在连续的存储的空间上,当向该vector中插入一个新元素时,必须保持新的容器仍然满足元素连续存储的条件;这时候就要重新分配存储空间,平且把原创 2017-04-10 17:38:03 · 2065 阅读 · 0 评论 -
查找最小的K个数
输出最小的K个数 方案1:如果输入的数组可变,我们可以借助Partion部分排序的思想,随机选k值,经过排序后,k左边的数都比k小,k右边的数都比k大,这样经过排序后,在k左边的数字就是最小的K个数:int Partion(int*a, int n, int left, int right){ if (a == NULL || n <= 0) { return 0原创 2017-08-27 10:21:11 · 543 阅读 · 0 评论