![](https://img-blog.csdnimg.cn/20190629234211419.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 80
包含C++语法讲解以及以下典型例题的思维剖析
giturtle
Stay hungry, stay foolish. Lu
展开
-
[C++] 不申请额外空间,逆序一个栈
第一次看到题目的时候,自然会联想到用函数栈帧来代替栈的内存,从而达到不申请额外空间的效果。思路设定一个函数作为入口函数,接收原始stack数据。入口函数中调用一个接口,接口会提取栈的最底元素后返回,在入口函数中接收它,这样在这个栈帧中就保存了这个元素值,在后续的流程中第一个接收的元素会在顺序的最后重新压入。递归调用入口函数,让他继续对栈进行操作,进行后续“提取最底元素”。当栈所有的最底元素提取完,此时栈为空了,此时层层函数的栈帧中tail字段保存了原来栈每一层的元素,要进行重新入栈了。从递归调转载 2022-05-16 00:19:24 · 385 阅读 · 0 评论 -
[C++] 图结构
之间使用vector实现过简单的并查集,但在刷题过程中,发现有关于图的例题中其效率不是很高,因为需要轮询,下面介绍的这种图结构可以满足大部分需要,模板提供给大家。点结构class Node {public: int val; int in; // 入度: 指向此点的边个数 int out; // 出度: 从此点发出的边个数 vector<Node*> nexts; // 直接邻接点 vector<Edge*> edges; // 边 Node(int val原创 2022-05-11 22:33:09 · 675 阅读 · 1 评论 -
二叉树Morris遍历代码记录
morris序ListNode *morris(ListNode *head) { ListNode *cur = head; ListNode *mostRight = nullptr; while (cur != nullptr) { mostRight = cur->left; // 判断cur有无左树 if (mostRight != nullptr) { // 有左树,找到真实最右节点 while (mostRight->right != nullpt原创 2022-05-08 23:30:42 · 620 阅读 · 1 评论 -
[C++] 局部反转链表
目录例题描述解题思路代码实现例题描述给定单链表的某一段区间,即传参为某两个节点,反转两节点区间之内的所有节点,对于区间外的节点不需操作。传参保证节点a对于节点b,一定在链表的上游。示例:对于某一链表:1->2->3->4->5->NULL,入参为节点值为2和5的节点地址a和b,调用完成后结果为:输出: 5->4->3->2结构体定义struct ListNode { int val; struct ListNode *next原创 2022-03-20 16:44:07 · 1367 阅读 · 0 评论 -
[C++] k个一组反转链表
目录例题描述解题思路代码实现例题描述此问题为反转单链表的引申问题之一,在单链表翻转的基础上增加一些边界控制,使链表完成k个节点一组的特殊化反转。最终返回反转后的链表头节点。这里给出原问题链接:【反转一个单链表】https://blog.csdn.net/qq_42351880/article/details/88637387此算法入参有两个:链表头节点、每组节点数k示例:输入: 1->2->3->4->5->6->NULL如果参数k = 2, 输原创 2022-03-20 16:01:20 · 1469 阅读 · 1 评论 -
[C++] JZ75 字符流中第一个不重复的字符
目录例题描述解题思路一:队列+bitmap代码实现解题思路二:双bitmap代码实现例题描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go"时,第一个只出现一次的字符是"g" 。当从该字符流中读出前六个字符 “google"时,第一个只出现一次的字符是"l"。数据范围:字符串长度满足1≤n≤1000,字符串中出现的字符一定在ASCII码内。后台会用以下方式调用Insert和 FirstAppearingOnce函数string caseout原创 2022-03-22 23:30:28 · 715 阅读 · 1 评论 -
[数据结构] 二叉树转双向链表
目录例题描述代码实现例题描述将该二叉树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二叉树结点结构体定义struct TreeNode { struct TreeNode *left; struct TreeNode *right;};代码实现Node *prev = NULL; // 保证按有序的顺序调用该函数void NodeToDo...原创 2019-04-14 21:16:24 · 1213 阅读 · 0 评论 -
[C++] JZ82/34/84 二叉树中和为某一值的路径
目录题目描述解题思路代码实现进阶:打印出每一条合法路径解题思路代码实现题目描述给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum的路径。该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点叶子节点是指没有子节点的节点路径只能从父节点到子节点,不能从子节点到父节点总节点数目为n例如:给出如下的二叉树返回true,因为存在一条路径 5→4→11→2的节点值之和为 22/数据范围:树上的节点数满足0 ≤ n ≤ 10000每个节点原创 2022-03-10 23:15:01 · 203 阅读 · 2 评论 -
Dynamic Programming -- 动态规划
动态规划定义特点本质样例Fibonacci变态青蛙跳台阶(Climbing Stairs)定义动态规划简称DP问题,是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。特点动态规划具备了以下三个特点:把原来的问题分解成了几个相似的子问题。所有的子问题都只需要...原创 2019-08-22 01:19:52 · 137 阅读 · 0 评论 -
从零学C++11
C++11上篇中篇下篇点击下面蓝色字体跳转超链接上篇【从零学C++11(上)】列表初始化、decltype关键字、委派构造等新特性中篇【从零学C++11(中)】移动语义、右值引用、std::move()、完美转发等新特性下篇【从零学C++11(下)】lambda表达式、线程库、原子操作库等新特性...原创 2019-12-17 13:10:16 · 241 阅读 · 0 评论 -
【从零学C++11(中)】移动语义、右值引用、std::move()、完美转发等新特性
C++118. 默认函数控制显式缺省函数删除默认函数9. 右值引用【★】移动语义C++11中的右值右值引用std::move()注意点完美转发8. 默认函数控制在C++中对于空类编译器会生成一些默认的成员函数,比如:构造函数、拷贝构造函数、运算符重载、析构函数、&和const&的重载、移动构造、移动拷贝构造等函数。如果在类中显式定义了,编译器将不会重新生成默认版本。有时候这...原创 2019-11-14 10:31:08 · 339 阅读 · 0 评论 -
【C++】字符串的排列与组合 代码实现
排列void permutation(char* str) { if (str == nullptr) return; _Permutation(str, str);}void _Permutation(char* str, char *begin) { if (*begin == '\0') printf("%s\n", str); else { for (char* ...原创 2019-10-06 14:40:44 · 1066 阅读 · 0 评论 -
宏 实现 sizeof
sizeof操作符其实就是判断元素的字节数,那么很容易联想到指针的偏移量,所以尝试使用下面这种方式实现:#define my_sizeof(x) ((&x + 1) - &x)但问题是,无论如何输出都是1,为什么呢?因为指针减法的结果是元素个数而不是字节。,所以只需强转为按字节计算即可。#define my_sizeof(x) ((char*)((&x) + 1) ...原创 2019-09-11 10:56:44 · 516 阅读 · 0 评论 -
成员的初始化 表格
初始化方式类内(声明)类外(实现文件)构造函数中构造函数的初始化列表类型非静态非常量数据成员NNYY非静态常量数据成员NNNY(must)静态非常量数据成员NY(must)NN静态常量数据成员YYNN构造函数中,成员变量一定要通过初始化列表来初始化的是:const成员引用成员需要类外初始化的是static成...原创 2019-09-11 00:19:09 · 115 阅读 · 0 评论 -
C++实现一个 Date (日期)类
DateDate.hDate.cppDate.h#pragma once#include <iostream>#include <assert.h>using std::cout;using std::endl;class Date{public: inline int GetMonthDay(int year, int month) const{...原创 2019-08-29 22:07:49 · 306 阅读 · 0 评论 -
【从零学C++11(下)】lambda表达式、线程库、原子操作库等新特性
C++1110. lambda表达式【★】语法捕获列表函数对象与lambda表达式对比11. 线程库【★】线程的启动线程的结束原子性操作库(atomic)10. lambda表达式【★】例如在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法,具体如下:#include <algorithm>#include <functional...原创 2019-08-29 19:19:09 · 534 阅读 · 0 评论 -
【从零学C++11(上)】列表初始化、decltype关键字、委派构造等新特性
C++111. 列表初始化内置类型自定义类型2. 变量类型推导decltype关键字3. 基于范围for的循环4. final与override5. 智能指针6. 新增加容器:unordered系列7. 委派构造函数8. 默认函数控制显式缺省函数删除默认函数9. 右值引用【★】10. lambda表达式【★】11. 线程库虽然现在C++迭代到C++20版本了,但是作为最近的经典还非C++...原创 2019-08-29 17:13:12 · 299 阅读 · 0 评论 -
C++ 之 栈和队列(容器适配器)
栈和队列特性栈(stack)队列(queue)优先级队列(priority_queue)使用容器适配器特性栈(stack)stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容...原创 2019-08-29 00:50:10 · 514 阅读 · 0 评论 -
[C++] 使用 deque 模拟实现栈(stack)
template<class T, class Container = deque<int>>class Stack{public: void Push(const T& x){ _con.push_back(x); } void Pop(){ _con.pop_back(); } size_t Size() const{ return...原创 2019-08-29 00:09:42 · 516 阅读 · 0 评论 -
[C++] 使用 deque 模拟实现队列(queue)
template<class T, class Container = deque<int>>class Queue{public: void Push(const T& x){ _con.push_back(x); } void Pop(){ _con.pop_front(); } size_t Size(){ _con.size()...原创 2019-08-29 00:05:51 · 420 阅读 · 0 评论 -
C++ 之 deque
deque特性迭代器小结特性deque是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以向两端进行伸缩。特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效。与ve...原创 2019-08-28 23:49:52 · 312 阅读 · 0 评论 -
C++ 之 list
list特性迭代器失效问题模拟实现特性list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似,最主要的不同在于:forward_list是单链表,只能向后迭代,其更简单高效。与其他的序...原创 2019-08-28 01:10:37 · 456 阅读 · 1 评论 -
C++ 之 vector 容器
vector特性迭代器失效问题源码剖析模拟实现特性vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素,说明可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质上vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存...原创 2019-08-28 00:40:05 · 217 阅读 · 0 评论 -
C++实现简单的 并查集
#include <iostream>#include <vector>using namespace std;//并查集class UnionFindSet{ public: UnionFindSet(size_t n){ _ufs.resize(n,-1); } int FindRoot(int x){ ...原创 2019-08-26 01:17:25 · 259 阅读 · 0 评论 -
C++实现简单的 图
#include <iostream>#include <vector>#include <string>#include <queue>#include <assert.h>using namespace std;template<class V,class W,bool IsDirect = false> ...原创 2019-08-26 01:16:39 · 265 阅读 · 0 评论 -
C++之 模板(下)模板的特化、类型萃取、分离编译
模板非类型模板参数类模板的特化函数模板特化类模板特化全特化偏特化类型萃取模板的分离编译在上篇博客中我们简单讲了一下两大部分:函数模板与类模板,本篇博客我们讨论一下它的边缘知识~非类型模板参数模板参数分为:类型形参与非类型形参。类型形参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称。非类型形参,就是用一个常量作为类 / 函数模板的一个参数,在类 / 函数模...原创 2019-08-25 00:54:21 · 1074 阅读 · 1 评论 -
C++之 模板(上)泛型编程、函数模板、类模板
模板泛型编程模板函数模板实例化隐式实例化显式实例化匹配原则类模板实例化我们之前讲解过函数重载,对于函数名相同,参数不同的函数都得实现一个相应的重载函数,这样就十分的麻烦~有没有一份代码可以在多种情况下达到复用的物什?有的!这就要提到泛型编程。泛型编程泛型编程:即以一种独立于任何特定类型的编码方式。编写与类型无关的通用代码,是代码复用的一种手段。【模板则是泛型编程的基础】模板模板:是...原创 2019-08-24 23:36:59 · 312 阅读 · 0 评论 -
[C++] B树的简单实现
template<class K,size_t M = 1024>struct BTreeNode{ K _key[M]; BTreeNode<K,M>* _sub[M+1]; //多给一个方便分裂 BTreeNode<K,M>* _parent = nullptr; size_t _keysize;};template<cl...原创 2019-08-22 00:56:45 · 315 阅读 · 1 评论 -
C++之 内存管理
内存管理用户地址空间内存管理方式new/deletenew和delete操作自定义类型operator new与operator delete函数operator newoperator deletenew和delete的实现原理内置类型自定义类型定位new表达式(placement-new)malloc/free和new/delete的区别例题两则内存泄漏分类如何检测如何避免用户地址空间......原创 2019-08-20 19:46:35 · 204 阅读 · 0 评论 -
十种常见的设计模式
设计模式单例模式策略模式代理模式观察者模式装饰模式适配器模式命令模式组合模式简单工厂模式模板方法模式侵删单例模式实现方式:a) 将被实现的类的构造方法设计成private的。b) 添加此类引用的静态成员变量,并为其实例化。c) 在被实现的类中提供公共的CreateInstance函数,返回实例化的此类,就是b中的静态成员变量。优点:在单例模式中,活动的单例只有一个实例,对单例...转载 2019-08-20 18:41:27 · 104 阅读 · 0 评论 -
[C++] 单例模式:饿汉、懒汉demo
单例模式设计模式单例模式饿汉模式懒汉模式设计模式设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。早期有23种设计模式。为什么会产生设计模式呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。使...原创 2019-08-20 17:58:41 · 165 阅读 · 0 评论 -
[C++] STL快速一览
STL什么是STL?STL版本STL六大组件STL的缺陷小结什么是STL?STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL版本HP版本(原始版本):Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任...原创 2019-08-18 22:42:44 · 224 阅读 · 0 评论 -
C++之 强制类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)
类型转换引入static_castreinterpret_castconst_castdynamic_cast模拟实现explicit关键字强转的必要性RTTI:运行时类型识别引入类型转换这个概念在许多编程语言中都有涉及,比如最经典的编程语言:C语言,它对类型转换的处理可视性比较差,所有的转换形式都是以同一种相同形式书写:在变量前声明转换类型,这样的方式难以跟踪错误的转换。举例:int ...原创 2019-08-17 00:34:24 · 547 阅读 · 0 评论 -
C++之 智能指针
智能指针引入RAII1. auto_ptr底层探究2. unique_ptr3. shared_ptr4. weak_ptr引入试想一下:如果malloc申请出来的空间没有进行释放,那就存在内存泄漏的问题。再者说异常安全问题。如果在malloc和free之间存在异常抛出,那么还是存在内存泄漏的异常安全问题。没有内嵌垃圾回收机制的C++,对于它的程序编写人员的要求就十分严苛。那么有没...原创 2019-08-15 00:42:30 · 234 阅读 · 0 评论 -
C++之异常
异常引入C++异常概念使用方法异常的抛出和捕获异常的重新抛出异常安全异常规范自定义异常体系C++标准库的异常体系C++异常的优缺点优点缺点总结引入讨论C++的异常,首先回顾一下C语言传统的错误处理方式~终止程序,如assert。缺陷:太过严苛。如发生内存错误 / 除0错误就会终止程序。(虽然犯错,但罪不至死吧大人~)返回错误码。缺陷:需要程序员自己去查找对应的错误。如系统的很多库的...原创 2019-08-14 21:59:04 · 103 阅读 · 0 评论 -
C++之多态
多态引入构成条件虚函数虚函数的重写(覆盖)虚函数重写特例1. 协变2. 析构函数的重写C++11:override 和 final 关键字finaloverride重载、重写、重定义抽象类面向对象三大特性之一:多态。引入通俗来说,多态就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。比如消费行为,当普通顾客购买时,一般都是全额付款。而当VIP付款时,总是...原创 2019-08-13 23:15:05 · 988 阅读 · 0 评论 -
[C++] 海量数据专讲:抖音、快手每日几亿用户活跃数据如何处理?(位图 与 布隆过滤器)
哈希小引位图实现一个位图类应用布隆过滤器概念布隆过滤器的插入布隆过滤器的查找布隆过滤器的删除优点缺陷海量问题扩展小引本篇所讲的位图与布隆过滤器,其实都是哈希表的具体应用~这两个结构对于处理海量数据都有很好的功效!区别:位图:适合处理整型数据。布隆:适合处理字符型等非整型数据。位图例如小视频服务器每天有海量的整型数据到达需要处理,使用位图就十分高效,不仅记录方便,存储更是十分...原创 2019-08-05 23:51:28 · 993 阅读 · 0 评论 -
[C++] 哈希结构
哈希开散列闭散列开散列template<class K>struct HashFunc{ //仿函数 const K& operator()(const K& key){ return key; }};template<>struct HashFunc<string>{ //针对字符串key值的【模板特化】 size_...原创 2019-08-01 23:54:09 · 749 阅读 · 2 评论 -
[C++] 栈的压入、弹出序列
目录例题描述解题思路代码实现例题描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。假设压入栈的所有数字均不相等。例如:序列{1,2,3,4,5}是某栈的压栈序列,序列{4,5,3,2,1}是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。解题思路解决该问题需要借助一个辅助栈,把输入的第一个序列中的数字依次入...原创 2019-07-24 11:20:57 · 2637 阅读 · 0 评论 -
[C++] 数值的整数次方(模拟pow函数)
本题相当于实现一个库函数中的pow函数:一般解法//一般解法:无法完成底数为 0 ,或 负数 的情况double Power1(double d,int n){ double ret = 1; for (int i = 1; i <= n; ++i) { ret *= d; } return ret;}优化解法//优化解法,但效率不高double PowerFun...原创 2019-07-11 18:09:15 · 775 阅读 · 0 评论