c++中的重点问题
阳光丿洒脱
死亡不是终点,遗忘才是。
展开
-
深入理解c++中的函数模板
非类型模板参数模板参数分类类型形参与非类型形参。类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。namespace bite{ template<class T, size_t N> class array { public: ...原创 2019-11-16 20:47:23 · 467 阅读 · 0 评论 -
初识c++中的函数模板
函数模板函数模板概念函数模板:编译器生成代码的一个规则。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板格式//要让这个函数与类型无关//Add函数模板template<class T,typename s> //模板的参数列表//告诉编译器T是一种类型T Add(T left, T right){ r...原创 2019-11-14 09:23:59 · 144 阅读 · 0 评论 -
c++实现日期类
实现我们可以很快知道,一个日期有年月日,我们可以很快的写出以下代码class Date{public: Date(int year, int month, int day) :_year(year) , _month(month) , _day(day) {}private: int _year; int _month; int _day;};但是我们这个日...原创 2019-11-09 11:47:33 · 427 阅读 · 0 评论 -
c++动态内存管理题目
malloc/free和new/delete的区别malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可malloc的返回值为void*...原创 2019-11-07 17:32:25 · 338 阅读 · 0 评论 -
c++动态内存管理
c/c++内存分布 int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = {1, 2, 3, 4}; char char2[] = "abcd"; ...原创 2019-11-07 17:06:59 · 385 阅读 · 0 评论 -
模拟实现priority_queue优先级队列
优先级队列无参构造priority_queue() :c() {}区间构造区间构造需要用到迭代器,而迭代器每个容器的类型不一样,所以用模板给出,初始化列表,把用户给进来的元素空间起始位置,放到优先级队列中底层空间的位置,然后进行调整,把它调整成一个堆template<class Iterator> priority_queue(Iterator first, ...原创 2019-11-06 16:40:09 · 273 阅读 · 0 评论 -
c++中容器适配器
什么是容器适配器适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该中模式是将一个类的接口转换成客户希望的另外一个接口。stack模拟封装template<class T,class Container = deque<T>> class stack { public: stack() {} vo...原创 2019-11-06 14:52:22 · 355 阅读 · 1 评论 -
详解优先级队列priority_queue(应用+模拟实现)
优先级队列的概念优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任...原创 2019-11-06 14:14:31 · 806 阅读 · 0 评论 -
复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值
栈和队列的概念栈:吃进去吐出来对列:吃进去拉出来数据结构中的栈和内存中的区别数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性。栈和队列操作栈和队列基本操作栈操作栈中没有迭代器,因为不需要遍历元素。最小栈栈里面肯定有,push/pop/top操作,而且三个操作的时间复杂度是---->O(1)我们要添加一个操作...原创 2019-11-02 22:17:22 · 199 阅读 · 0 评论 -
vector和list容器有哪些区别
这个问题的本质还是在问顺序表和链表的区别底层结构不同vector容器list容器一段连续的空间带头结点的双向循环链表元素访问方式vector容器list容器支持随机访问—O(1)不支持随机访问—O(N)需要扩容不需要扩容任意位置插入元素----O(N)–搬移元素O(1)迭代器不同vector容器list容器...原创 2019-10-31 15:41:30 · 602 阅读 · 0 评论 -
详解list容器(应用+模拟实现)
list容器带头结点的双向循环链表list操作list容器的概念及其操作构造和销毁 list<int>L1; list<int>L2(10, 5); vector<int>v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; list<int>L3(v.begin(), v.end()); list<int>...原创 2019-10-30 22:01:21 · 700 阅读 · 0 评论 -
详解vector容器(应用+模拟实现,vector相关练习题)
vector容器动态的顺序表,数组。vector操作vector操作及其概念构造 vector<int>v1; vector<int>v2(10, 5); vector<int>v3(v2); int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; vector<int>v4(array,...原创 2019-10-28 22:02:27 · 1810 阅读 · 0 评论 -
浅拷贝+引用计数--写时拷贝---模拟实现string容器
引用计数深拷贝多个对象共享同一份资源时,最后能够保证该资源只被释放一次应该由哪个对象释放资源?由最后一个使用该资源的对象去释放怎么知道一个对象是最后一个使用该资源的对象?给一个计数,记录使用该资源对象的个数实现计数用普通整型先来看一个例子class string{public: string(char *str = "") { //如果指针为空,则初始化位空字符串...原创 2019-10-26 22:20:47 · 688 阅读 · 0 评论 -
详解string容器(应用+模拟实现,string练习题)
为什么要有string容器string:其实就是一个字符串,c++对字符串进行了封装的,封装到一个类里面,这样用户就不用担心开辟空间的问题,只需要往string类里放字符串就可以了,string其实还可以自增长很多人就会有一个疑问,以前在c语言中,已经有字符串了,其实c语言中表示字符串就是char*,也就是字符数组+'\0'string应用string类常用接口构造 string s...原创 2019-10-26 18:16:28 · 566 阅读 · 0 评论 -
详解 二叉搜索树-----AVL树
二叉搜索树根结点比左子树中所有结点都大根结点比右子树所有结点都小最小的元素在最左侧最大的元素在最右侧中序遍历有序具有以上的特征的二叉树就是二叉搜索树也叫二叉排序数二叉搜索树的操作查找插入树为空,则直接插入树不空,按二叉搜索树性质查找插入位置,插入新节点删除首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:要删除的结...原创 2019-10-15 17:32:07 · 728 阅读 · 0 评论 -
二叉树题目 ----7 前序中序遍历构造二叉树
前序中序遍历构造二叉树思路在前序中找根结点根据根结点 + 中序,分成左右两棵子树根据子树长度,把前序分成左右两颗子树递归处理子树/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct Tree...原创 2019-10-12 15:22:17 · 351 阅读 · 0 评论 -
二叉树题目----6 二叉树的最近公共祖先 AND 二叉树搜索树转换成排序双向链表
二叉树的最近公共祖先思路在左、右子树中分别查找是否包含p或q:如果以下两种情况(左子树包含p,右子树包含q/左子树包含q,右子树包含p),那么此时的根节点就是最近公共祖先如果左子树包含p和q,那么到root->left中继续查找,最近公共祖先在左子树里面如果右子树包含p和q,那么到root->right中继续查找,最近公共祖先在右子树里面 struct TreeNo...原创 2019-10-12 11:28:23 · 144 阅读 · 0 评论 -
再写堆(堆的性质,向下调整,建堆,堆的插入删除初始化,堆排序,TopK问题)
堆的概念如果有一个关键码的集合K={k0,k1,k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储再一个一维数组中,并满足:Ki<=K2i+1且Ki<=K2i+1(Ki >= K2i+1 且 Ki >= K2i+2),i=0,1,2,3…。则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆堆的性质堆中某个节点的...原创 2019-10-11 19:05:32 · 481 阅读 · 0 评论 -
再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)
树的概念树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多 个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结 点可以分为多个不相交的子树一些基本概念节点的度:一个节点含有的子树的个数称...原创 2019-10-06 08:54:03 · 291 阅读 · 0 评论 -
链表题目--1 删除链表中所有等于val的值
注意事项要删除的结点相邻第一个结点就是要删除的结点/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* removeElements(struct ListNode...原创 2019-10-03 18:49:57 · 673 阅读 · 0 评论 -
二叉树题目----5 平衡二叉树 AND 根据二叉树创建字符串
平衡二叉树/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */int MAX(int a,int b){ return a > b...原创 2019-10-11 16:01:45 · 178 阅读 · 0 评论 -
c++中的智能指针详解(RAII, auto_ptr的原理及其改进,unique_ptr的原理,shared_ptr的原理,shared_ptr的缺陷及其改进)
为什么需要智能指针代码中途退出,也能保证资源的合理释放,在c++中没有垃圾回收机制的情况下,智能指针就可以保证我们申请的资源,最后忘记释放的问题,防止内存泄露,也帮我们减少了一定的负担,不用再在所有可能退出的地方都进行是否释放的检测。RALLRAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句 柄、网络连...原创 2019-10-09 08:40:09 · 7921 阅读 · 2 评论 -
二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)
typedef struct TreeNode{ struct TreeNode *left; struct TreeNode *right; char val;}TreeNode;typedef struct Result{ TreeNode * root; //构建的树的根结点 int used; //构建过程中用掉的val个数} Result;求二叉树中...原创 2019-10-08 17:20:35 · 1181 阅读 · 0 评论 -
c++常见并且必须记住的问题
一、基础知识基本语言1、说一下static关键字的作用2、说一下C++和C的区别3、说一说c++中四种cast转换4、请说一下C/C++ 中指针和引用的区别?5、给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码6、怎么判断一个数是二的倍数,怎么求一个数中有几个1,说一下你的思路并手写代码7、请你说一下你理解的c++中的smart pointer四...转载 2019-09-28 14:43:41 · 624 阅读 · 0 评论 -
再写顺序表(c语言实现,外加冒泡排序,二分查找)
概念顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。头文件声明SeqList.h#pragma once#include<stdbool.h>typedef int SDataType;/*//静态顺...原创 2019-10-03 11:49:21 · 930 阅读 · 0 评论 -
再写单链表(不带头单链表)
单链表实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:单向、双向带头、不带头循环、非循环虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如哈希桶、图的邻接表等等。另外这种结构在学校的考试中出现很多。带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用...原创 2019-10-03 16:35:29 · 163 阅读 · 0 评论 -
再写双向循环链表
#pragma once#include<assert.h>#include<malloc.h>#include<stdio.h>typedef int DLDataType;//定义链表结点结构typedef struct DListNode{ DLDataType value; struct DListNode *prev; //指向前...原创 2019-10-03 18:21:53 · 336 阅读 · 0 评论 -
链表题目--2 求链表的中间结点 和 求链表中倒数第k个结点
思路一个走两步,一个走一步。一个走到尾,另外一个就走到了中间原创 2019-10-04 11:22:07 · 221 阅读 · 0 评论 -
链表题目---3 合并两个有序单链表 和 分割链表
合并两个有序单链表/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode*...原创 2019-10-04 15:10:28 · 232 阅读 · 0 评论 -
链表题目---4 删除链表中重复的结点 和 判断链表是否为回文链表
删除链表中重复的结点/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* deleteDuplication(ListNod...原创 2019-10-05 08:35:41 · 117 阅读 · 0 评论 -
链表题目----5 相交链表 和 环形链表 和 返回链表开始入环的第一个节点
相交链表思路链表交叉不可能是x型因为有可能两个链表不等长,所以我们必须让他们从同一起跑位置去起跑从同一起跑位置出发,依次比较每个结点的地址是否相同/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; *...原创 2019-10-05 09:07:18 · 143 阅读 · 0 评论 -
链表题目---6 复制带随机指针的链表
思路将新结点放在老结点的后面复制random将链表拆开/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node() {} Node(int _val, Node* _next, Node* _random) { ...原创 2019-10-05 11:21:32 · 251 阅读 · 0 评论 -
括号匹配问题(c和c++版本实现)
括号匹配问题思路遇见左括号入栈,遇见一个右括号弹出栈顶元素右括号入栈前如果栈已经为空,则不匹配如果不为空则读取并弹出,弹出来的元素与右括号做比较,必须匹配,不匹配返回false;如果最后栈里还有元素,则说明不匹配c版本实现typedef struct Stack{ int array[1000000]; int top;} Stack;//初始化void Stack...原创 2019-10-05 15:59:32 · 1757 阅读 · 0 评论 -
用队列实现栈 AND 用栈实现队列
用队列实现栈思路入队列就是入栈出队列的时候,就是把前面size-1个队列中的元素先出,这样最后一个元素就成队首元素了,再把出去的元素再次入队列读栈顶元素,过程和第二步是一样的,就是弹出后,再把它入队列typedef struct Node{ int value; struct Node *next;}Node;//头删+尾插typedef struct Queue{...原创 2019-10-05 17:08:22 · 116 阅读 · 0 评论 -
最小栈的实现(设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。)
最小栈的实现思路两个栈,左边栈接受元素,右边栈存最小的元素入栈时,先入左边栈,随后进行比较,左边和右边栈顶元素进行比较,如果新元素小,就把新元素放在右边的栈顶位置,如果新元素大,则还是把右边栈顶元素放在栈顶的位置出栈时,出的是最后一个入栈元素,所以就是左边的栈出栈出最小值时,就是右边的栈顶元素出栈出栈时两个都得出class MinStack {public: /** ini...原创 2019-10-05 17:48:29 · 4651 阅读 · 1 评论 -
再写循环队列----c++实现
再写循环队列class MyCircularQueue {public: /** Initialize your data structure here. Set the size of the queue to be k. */ MyCircularQueue(int k) { array = (int *)malloc(sizeof(int)*k); capacity = k...原创 2019-10-05 18:28:49 · 180 阅读 · 0 评论 -
二叉树题目----1 前序中序后序遍历二叉树并返回相应的遍历(不是打印)
前序遍历/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** * Note: The returned array must be ma...原创 2019-10-06 09:06:57 · 164 阅读 · 0 评论 -
二叉树题目----2 检查两颗树是否相同 和 对称二叉树的判定
检查两颗树是否相同思路根要相等 p->val == q->val左子树相等 isSameTree(p->left,q->left)右子树也要相等 isSameTree(p->right,q->right)/** * Definition for a binary tree node. * struct TreeNode { * in...原创 2019-10-06 10:29:47 · 205 阅读 · 0 评论 -
二叉树题目---3 另一个树的子树 AND 二叉树最大深度
另一个树的子树原创 2019-10-07 09:25:45 · 153 阅读 · 0 评论 -
二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数
前序遍历重构二叉树思路整个二叉树用数组存储因为先序遍历它先遍历根,再遍历左,左边没有跑完是不会去遍历右边的,所以遍历左子树,就是数组元素每回向后一个,个数-1遍历右边时,就是数组起始位置+左子树跑到的位置+每次往后走一个,大小就是减去左子树用掉的个数+每回个数-1因为要返回遍历的位置,和遍历用掉的个数,所以每回都要返回两个值,用结构体返回。#include<stdlib....原创 2019-10-07 10:44:49 · 196 阅读 · 0 评论