自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

路漫漫其修远兮

每天学一点!

  • 博客(363)
  • 收藏
  • 关注

原创 C++11智能指针的前因后果

0 前言据说用过java的人都说java好,很大一部分是java里没有指针的概念,并提供自动垃圾机制,而C/C++语言经常会被内存的释放问题搞得头疼。全局对象在程序启动时分配,在程序结束时销毁。对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁。局部stratic对象在第一次使用前分配,在程序结束时销毁。对于自动和static对象外,C++还支持动态分配对象。动态分配...

2019-08-21 20:42:20 1094 1

原创 C++显示调用构造函数和析构函数

文章目录直接通过<类名>::构造函数或析构函数通过placement new类在new的时候其实做了两件事情:(1)调用malloc分配所需的内存(实际上是调用operator new)(2)调用构造函数类在delete的时候其实也做了两件事:(1)调用析构函数(2)调用free释放内存(实际上是调用operator delete)直接通过<类名>::构造函数...

2020-01-11 16:16:24 1179

原创 define与typedef、const、inline的区别

define与typedef区别  define是宏定义,typedef是重命名。typedef int int_32;typedef void(*Func)(int); // Func为一个函数指针#define PI 3.1415 // 宏定义没有;#define max(x,y) ((x)>(y)?(x):(y)) 作用域不同typedef(1)如果放在所有...

2020-01-11 15:10:36 547

原创 堆和栈

文章目录简介为什么栈向下增长为什么栈要比堆快为什么要使用栈来保存函数参数或者局部变量如何验证栈的增长方向栈帧函数参数压栈顺序栈溢出栈溢出例子简介  C/C++,一般内存模型从低到高分别为:text代码段,data全局/静态已初始区域,bss全局/静态未初始化区域,heap堆,stack栈,内核区。如下图所示[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOXh...

2020-01-11 14:33:07 376

原创 指针和引用的区别

文章目录引用和指针的区别汇编层次解释引用指针和引用函数调用的区别引用的好处引用和指针的区别(1)引用必须初始化,指针可以不初始化且可以为空(2)引用不可更改其绑定对象,指针可以改变其指向对象(3)sizeof对于引用得到是绑定对象的大小,而指针为4个字节(32位下)(4)引用不是对象,指针是对象,所以不能定义引用的引用(5)引用只能绑定在对象上,而不能绑定到字面值或某个表达式计算结果;...

2020-01-11 14:00:57 408

原创 C++11中的新容器(array,无序容器,tuple元组)

文章目录shrink_to_fitarrayforward_list无序容器元组tuple定义和初始化tuple访问tuple成员tuple中成员的数量和成员类型合并tuple遍历tupleC++11实现tuple的遍历C++14/17遍历参考资料shrink_to_fit// VS2019int main() { vector<int> arr(100); arr.empl...

2020-01-03 20:18:39 957 1

原创 C++11中的function和bind

  C++11中引入lambda,与operator() 和 函数(函数指针)统称为可调用对象。而operator()和lambda也实现了闭包。闭包的概念  闭包是带有上下文的函数,这个函数带有状态,也就是重载了()的类。什么叫 “带有状态” 呢? 意思是这个闭包有属于自己的变量,这些个变量的值是创建闭包的时候设置的,并在调用闭包的时候,可以访问这些变量。  函数是代码,状态是一组变量,将...

2020-01-02 20:04:49 2159

原创 C++11-17中auto和decltype

文章目录autoC++11中auto的用法auto的注意点C++11中decltype的用法decltype的注意点C++14和17中的auto和decltype用auto声明函数返回值auto可用于lambda表达式的参数decltype(auto)声明函数返回类型用初始化值列表初始化变量auto的语义在if和switch中用auto参考资料  用过matlab、python等语言会发现,刚开...

2019-12-27 20:20:25 870 1

原创 C++11中的列表初始化

文章目录统一初始化防止类型窄化initializer_list统一初始化  C++之前对内置数组可以都过花括号进行初始化,而对于vector数组、自定义类型无法通过花括号初始化。// C++11之前的初始化int a1[5] = {1, 2, 3};int a2[] = {1, 2, 3};int b(0);int c1{0}; // c++98错误,C++11通过int c2...

2019-12-26 14:57:23 783

原创 this指针和delete this

文章目录this指针的作用this指针是否可以为空delete this合法吗this指针的作用  this指针是指向类对象的指针,在类的成员函数中通过this指针这个隐式参数来访问调用它的对象。当我们调用一个成员函数时,编译器会把对象的地址传给成员函数的隐式形参this。this指针可以区分静态成员函数和外部函数(如静态函数),后者没有。  为什么要引入this指针。由于每个对象都有其状态...

2019-12-24 19:46:30 612

原创 C++11-17中的lambda

文章目录可调用对象谓词lambda捕捉列表值捕获引用捕获可变lambda:mutable异常说明指定lambda返回类型lambda 捕捉表达式泛型lambdaconstexpr lambda向lambda传递this的拷贝参考资料可调用对象  可调用对象,有函数、函数指针、重载了函数调用运算符的类(也就是仿函数)、lambda表达式四种形式。这里主要介绍lambda的作用。谓词  先看下...

2019-12-21 21:16:03 1015

原创 C++中的RTTI

  RTTI (Runtime Type Information,运行时类型信息),它提供了运行时确定对象类型的方法,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。为什么会出现RTTI这一机制,这和C++语言本身有关系。和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,C++中的指针或...

2019-12-18 21:07:25 1433 1

原创 编译器优化RVO和NRVO

编译器选择  如果想自己实践RVO和NRVO,不要在VS下尝试(这里的VS不是指VS code),用支持g++的编译器去测试(我这里用的是minGW)。因为VS无论在Debug还是Release下都是无法关闭RVO优化的,Dubug下可以关闭NRVO优化。而g++默认都是执行NRV0优化的。RVO/NRVO  RVO(Return Value Optimization,返回值优化),而NRV...

2019-12-17 15:00:43 1575 1

原创 浅谈拷贝构造/赋值运算符函数

  拷贝构造函数和赋值运算符函数都是类中的特殊函数。什么时候执行拷贝构造函数/赋值运算符函数?拷贝初始化和直接初始化有什么区别?拷贝构造函数  如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。 如果第一个参数不是引用类型,为了调用拷贝构造函数,必须拷贝它的实参,但为了拷贝它的实参,有需要调用拷贝构造函数,如此无限循环。拷贝赋值运算符  ...

2019-12-13 19:51:11 262

原创 C++11中的nullptr和constexpr

nullptr  nullptr的出现是为了代替NULL,首先看下NULL的定义:// vs2017下#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif#endif  C++将NULL视为0,所以以下代码就会影响直...

2019-12-13 15:45:06 261

原创 C++11中的override和final关键字

(1)override  含义:被标识的函数需要强制重写基类虚函数。class Base {public: Base() = default; ~Base() = default; virtual void test() {}};class Derived : public Base {public: Derived() = default; ~Derived() = de...

2019-12-12 18:27:24 194

原创 C++11中的default和delete

  C++一个类如果没有显式定义一些函数(如构造函数、析构函数、拷贝函数等),编译器在需要的时候会生成一个默认版本。C++11引入default和delete关键字,增强对类默认函数的控制,当让这不是全部功能。(1)default  含义:被标识的默认函数将使用类的默认行为。class Test {public: Test() = default; // Test(int x = 0)...

2019-12-12 16:28:34 225

原创 C中的volatile关键字

  volatile是C中的关键字,一般在嵌入式中用的比较多,其用来解决变量在“共享”环境下容易出现读取错误的问题。若变量被定义为volatile,则代表着该变量可能会被意想不到的改变,即在程序运行过程中一直变,这个值每次被处理时,都要从内存中读取该值,而不会因编译器优化从缓存的地方读取(比如说读取缓存在寄存器中的数值),从而保证volatile变量被正确读取。先看下面的代码:int main(...

2019-12-11 15:44:10 188

原创 C/C++野指针

  野指针的定义:野指针不是nullptr,而是指向已经被释放的空间或者不可用的垃圾空间。常出现以下情形:(1)指针未初始化就使用int main() { int* p; if (p != nullptr) cout << *p << endl;}// 这段代码在VS2017下直接异常,提示p没有初始化// 因为指针不像引用必须初始化,所以这个p是未定义的...

2019-12-11 15:42:27 463

原创 C++重载机制

参考:博客1, 博客2  C++实现函数重载的技术手段是函数符号改名,所以我们可以通过分析编译器的函数符号改名机制来验证C++函数重载规则。(1) 如何查看编译器改名后的函数名  在VS编译器下,我们可以从符号表中看编译器如何改名的。符号表是在.map文件里,在vs里默认不显示符号表文件。要想显示出来,这样设置:属性—>配置属性—>链接器—–>调试—>生成映射文件—&...

2019-12-11 15:38:45 277

原创 572.另一个树的子树

题目描述给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例示例 1:给定的树 s: 3 / \ 4 5 / \1 2给定的树 t: 4 / \1 2返回 true,因为 t 与 ...

2019-12-03 10:28:35 85

原创 494.目标和

题目描述给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例输入: nums: [1, 1, 1, 1, 1], S: 3 输出: 5 解释:-1+1+1+1+1 = 3+1-1+...

2019-12-02 16:09:58 163

原创 468. 验证IP地址

题目描述  编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。​  IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。  IPv6 地址由8组16进制的数字来表示,每组表示 16 比特...

2019-12-01 14:15:27 284

原创 463. 岛屿的周长

题目描述  给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。  网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。  岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛...

2019-12-01 10:57:56 72

原创 445.两数相加 II

题目描述  给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。  你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:  如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> ...

2019-11-30 19:57:19 178

原创 415. 字符串相加

题目描述  给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。思路  竖式加法。代码class Solution {public:...

2019-11-30 18:21:39 166

原创 380. 常数时间插入、删除和获取随机元素

题目描述  设计一个支持在平均时间复杂度 O(1) ,执行以下操作的数据结构。insert(val):当元素 val 不存在时,向集合中插入该项。remove(val):元素 val 存在时,从集合中移除该项。getRandom:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。示例// 初始化一个空的集合。RandomizedSet randomSet = new Ran...

2019-11-30 17:28:43 125

原创 207.课程表

题目描述现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]  给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?...

2019-11-30 16:15:43 154

原创 238. 除自身以外数组的乘积

题目描述给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例输入: [1,2,3,4]输出: [24,12,8,6]说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空...

2019-11-29 20:18:01 99

原创 221. 最大正方形

题目描述在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4思路动态规划。(1)状态方程dp(i)(j)表示右下角下标为(i,j)时的最大正方形边长。当遇到0时,dp[i][j] = 0,肯定不能构成正方形;当遇到1时,有...

2019-11-28 10:16:12 108

原创 204. 计数质数

题目描述统计所有小于非负整数n的质数的数量。示例输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。思路参考来自:leetcode中文社区主要有两点:(1)判断一个数是不是质数,可以将遍历数组长度缩短到sqrt(n)。(2)如果一个数是质数,那么该数的所有倍数都不为质数。代码cl...

2019-11-27 19:04:41 109

原创 198. 打家劫舍

题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (...

2019-11-27 17:44:01 74

原创 150. 逆波兰表达式求值

题目描述根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例示例 1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((...

2019-11-26 10:50:12 152

原创 146. LRU缓存机制

题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新...

2019-11-25 16:21:18 131

原创 191. 位1的个数

题目描述编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’的个数。示例输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011中,共有三位为 '1'。思路只要比较最低位是否为1,然后右移1位。代码class ...

2019-11-25 15:04:32 83

原创 56.合并区间

题目描述给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重...

2019-11-19 09:34:38 91

原创 49. 字母异位词分组

题目描述给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出: [ ["ate","eat","tea"],["nat","tan"],["bat"] ]说明:所有输入均为小写字母。 不考虑答案输出的顺序。思路...

2019-11-17 18:58:29 107

原创 48. 旋转图像

题目描述给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例给定 matrix =[ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,...

2019-11-17 17:56:03 71

原创 46. 全排列

题目描述给定一个没有重复数字的序列,返回其所有可能的全排列。输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]思路回溯思想。因为没有重复数字所以比较简单。代码class Solution {public: vector<ve...

2019-11-16 09:05:45 68

原创 43.字符串相乘

题目描述给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = "2", num2 = "3"输出: "6"示例 2:输入: num1 = "123", num2 = "456"输出: "56088"说明:num1 和 num2 的长度小于110。...

2019-11-15 15:52:15 132

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除