自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 力扣刷题:28. 实现 strStr()

题目要求版本一:泛型算法search整体思路直接使用search函数,将haystack字符串和needl字符串传入,得到返回值根据返回值判断最终的结果代码class Solution {public: int strStr(string haystack, string needle) { if (needle.empty()) { return 0; } auto i = std::search(haystack.begin(),

2021-07-11 22:33:21 189 1

原创 力扣刷题:27. 移除元素

题目要求版本一:泛型算法find整体思路使用sort对序列进行排序使用find得到指定值的迭代器将迭代器转换为unsigned型index(删除容器元素会导致原有迭代器失效)根据index进行相应的删除操作返回删除后的序列长度代码class Solution {public:int removeElement(vector<int>& nums, int val) { std::sort(nums.begin(), nums.end()); auto i

2021-07-11 22:29:12 161

原创 力扣刷题:26. 删除排序数组中的重复项

题目要求版本一:使用库函数理解unique:重排元素,将重复值排在后面。返回第一个重复值的迭代器该函数重排输入序列,将不重复的值放在前面,重复的值放在后面。返回尾端第一个出现重复值的位置利用unique元素重排序列根据返回的迭代器删除重复值版本二:遍历删除整体思路遍历数组,比较当前值与前一个值是否相等,如果相等则删除代码class Solution {public:int removeDuplicates(vector<int>& nums) {if (

2021-07-11 22:23:55 187

原创 力扣刷题:24. 两两交换链表中的节点

题目要求整体思路以两个结点为一组,一组一组的处理。处理的方法是改变结点中next指针的指向。在改变指针的指向时,涉及到该组的前一个结点。所以每一组需要处理3个结点代码class Solution {public:ListNode* swapPairs(ListNode* head) { if (head == nullptr) return head; ListNode *p1 = head, *p2 = head->next, *p0 = nullptr;

2021-07-11 22:18:47 140

原创 力扣刷题:23. 合并K个升序链表

版本一:递归整体思路每次从链表数组中选取值最小的一个结点,进行递归。为21. 合并两个有序链表思路的延续。代码class Solution {public:ListNode* mergeKLists(vector<ListNode*>& lists) { //最大值为10的4次方 int minValue = std::pow(10, 4) + 1, minIndex = -1; for (int i = 0; i < lists.size(); +.

2021-07-09 22:34:34 104

原创 力扣刷题:22. 括号生成

题目要求整体思路根据传入的参数确定字符串的长度:传入n,说明有n对括号,则字符串长度应该是2n。接下来递归的构造字符串:当当前index超过字符串最大index(字符串长度-1)时,将当前字符串放入字符串数组中当当前index没有超过最大index时:如果当前字符串中存在没有匹配过的左括号,则在当前位添加右括号,继续递归如果当前字符串已经存在的左括号小于n,则在当前位添加左括号,继续递归代码class Solution {public:vector<string> gen

2021-07-09 22:30:06 119

原创 力扣刷题:21.合并两个有序数组

题目要求版本一:将链表放进数组里整体思路创建一个存储结点指针的vector,遍历两个链表的同时将对应结点的地址存入vector中存储完毕后进行特殊值判断:如果vector为空,则返回nullptr利用谓词和泛型算法sort按照val值<制作自定义sort使用自定义sort对vector进行排序。重组链表,将数组中相邻结点的next指针连接起来返回数组头元素(一般不推荐这么做,因为这样破坏了链表的结构,达不到训练的效果…)代码class Solution {public:Li

2021-07-09 22:22:35 166 2

原创 《C++标准库》第5章 通用工具

《C++标准库》第5章 通用工具pair和tuple便捷函数make_pair()Template函数make_pair(),能够让我们无须写出类型就能生成一个pair对象。make_pair函数的自动推断有时候可能并非用户所想,一个表达式用户明白的指出类型时,产生出来的pair将有绝对明确的类型Tuple(不定数的值组)Tuple中的每个类型由默认构造函数初始化,基础类型都会被初始化为0get函数所需要的index必须在编译期已知,运行期再传入一个值是不被允许的:便捷函数ref和

2021-04-01 12:44:11 342

原创 《C++标准库》第4章 一般概念

《C++标准库》第4章 一般概念头文件引入c标准头文件时,采用前缀字符c,不再采用扩展名.h为了向后兼容于C,旧式的C标准头文件仍然有效差错与异常处理针对语言支持而设计的异常类针对逻辑差错而设计的异常类针对运行期差错而设计的异常类异常类的头文件以Class exception_ptr传递异常C++11以后,可以将异常存储在exception_ptr对象中,稍后再在其他情景下使用可被调用对象当使用bind绑定类成员函数时,需要附带而外的对象指针,表示调用的是哪个对象

2021-04-01 12:42:51 68

原创 《C++标准库》第3章 语言新特性

《C++标准库》第3章 语言新特性nullptrnullptr是个新关键词,它会自动转换为各种pointer类型,但不会被转换为任何整数类型第二个函数调用会发生歧义,而第三个就不会一致性初始化C++11引入一致性初始化概念,意思是面对任何初始化动作,你可以使用相同语法,也就是使用大括号,以下皆成立:即使某个local变量属于基础类型(通常会有不明确的初值),也会被初始化为0窄化,也就是所谓的精度降低或造成数值变动——对大括号而言是不成立的初值列初始值列里存在迭代器,使用auto来

2021-04-01 12:42:00 74

原创 力扣刷题:20. 有效的括号

题目要求整体思路创建一个存放字符的栈接着遍历字符串:当遇到左括号时就将其push进栈中当遇到右括号时,首先检查栈是否为空。如果不为空则再检查栈的顶部元素是否为与该右括号匹配的左括号。如果匹配,将栈顶元素弹出。最后检查栈是否为空:为空返回true不为空返回false代码class Solution {public:bool isValid(string s) { std::stack<char> stackChar; for (auto i : s) {

2021-03-31 12:23:35 106

原创 力扣刷题:19. 删除链表的倒数第 N 个结点(翻转链表模板题!!!)

题目要求版本一:使用vector容器装结点指针(不知道这种方法在面试的时候能不能用…)整体思路创建一个存放结点指针的容器,遍历并将整个链表存储进容器之中。根据n算出需要删除的节点位置indexDelete删除时需要分情况讨论:如果indexDelete=0,为删除头结点或者只存在一个节点。只需令head = head->next即可。如果indexDelete=尾节点,为删除尾节点。只需令倒数第二个节点的next指向nullprt即可。其它情况为删除中间节点。只需令indexDel

2021-03-31 12:20:19 108

原创 力扣刷题:18. 四数之和

题目要求很喜欢评论区里面的一个评论:高端的coder往往用最朴素的解法。这题和15题“三数之和”类似,只是三个数变成了四个数,还是双指针。整体思路用两重for循环选取first和second。在第二重循环中初始化forth为数组的最后一个元素利用双指针在第三重for循环中寻找third和forth:如果 sum(四数之和) > target, 说明当前的数太大了,需要向前移动forth来减小数值如果 sum < target, 说明当前数太小了,需要向后移动third来增加数值

2021-03-31 12:13:28 146

原创 力扣刷题:17. 电话号码的字母组合

题目要求整体思路首先建一个长度为10的vecotor,存放与数字相对应的字母接着根据digits的长度,利用深度优先递归的组成字符串:当nowIndex小于maxIndex(字符串长度)时,将digits[index]数字对应的所有字母分别加入字符串尾部。当nowIndex大于maxIndex(字符串长度)时,将组成的字符串放进字符串数组中。最后返回字符数组代码class Solution {public:vector<vector<char>> vChar;

2021-03-31 12:11:16 273

原创 力扣刷题:16. 最接近的三数之和

题目要求和15题“三数之和”很类似,都用到了双指针。这题我套15题的思路和模板一遍就过了整体思路首先使用泛型算法sort对数组进行排序接着使用第一个for循环选取first然后利用双指针在第二个for循环中选取second和third。还是一如既往,second从小到大,而third从大到小,第二层for循环的逻辑如下:• 当sum-target<0时,说明选的数太小了,要选大一点的数,所以往右移动second指针。• 当sum-target>0时,说明选的数太大了,要选小一点的

2021-03-31 12:08:03 126

原创 力扣刷题:15. 三数之和

题目要求做完的感受:这道题的官方解法巧就巧在利用双指针将三重for循环降为了两重for循环,将第三个变量的寻找和第二个变量融合在一起,在一个for循环里面利用两个指针将两个存在一定关联的变量找出来,十分巧妙。代码:双指针(三重for循环改进为二重for循环)class Solution {public:vector<vector<int>> threeSum(vector<int>& nums){ vector<vector<int

2021-03-31 12:04:54 115

原创 《Effective C++》 读书笔记 条款51-55

Effective C++ 51-55 Note条款51:编写new和delete时需固守常规operator new应该内含一个无限循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handleroperator new应该有能力处理0bytes申请。Class专属版本还应该处理“比正确大小更大的申请”这里的new操作是基类的定制操作,而不是在派生类上使用。当传入一个size时,与基类的大小比较,如果它比基类的大小要大,则判断传入的是派生类,此时要调用标准new而不是定制

2021-03-24 11:42:12 145

原创 《Effective C++》 读书笔记 条款46-50

Effective C++ 46-50 Note条款46:需要类型转换时请为模板定义非成员函数当我们编写一个class template,而它所提供之“于此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template内部的friend函数”先看一个编译错误:上述的乘法无法通过编译,在调用模板函数operator*时,oneHalf的类型是Rational,2的类型是int。编译器不会执行隐式转换,所以它不知道该调用那个类型的具现化函数。解决方法

2021-03-24 11:40:52 114

原创 《Effective C++》 读书笔记 条款41-45

Effective C++ 41-45 Note条款41:了解隐式接口和编译器多态### Templates及泛型编程的领域中,隐式接口和编译期多态比较重要。隐式接口:w必须支持的接口由template中执行于w身上的操作决定:size、normalize、swap、copy构造函数、!=编译期多态:凡涉及w的任何函数调用,都可能造成template的具现化。不同template参数会导致调用不同的函数条款42:了解typename的双重意义声明template参数时,typename和cla

2021-03-24 11:39:22 72

原创 《Effective C++》 读书笔记 条款36-40

Effective C++ 36-40 Note条款36:绝不重新定义继承而来的non-virtual函数如果D重新定义函数mf:非虚函数都是静态绑定的,指针是什么类型就调用什么类型。如果派生类重新定义了非虚函数,就会发生遮掩,导致派生类和基类调用的函数版本不一样!条款37:绝不重新定义继承而来的缺省参数值绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual函数却是动态绑定的因为函数参数是动态绑定的,如果在派生类的虚函数中重写了缺省参数值,当通过一个指向派

2021-03-22 23:33:46 98

原创 《Effective C++》 读书笔记 条款31-35

Effective C++ 31-35 Note条款31:将文件间的编译依存关系降至最低如果没有很好的实现“将接口从实现中分离”,那么在后续修改类时,重新编译会很耗时间。当引入头文件时,会出现编译依存关系:在使用标准库时,引入标准头文件不会引发编译的相互依赖,可以放心引入标准头文件编译器必须在编译期间知道对象的大小支持“编译依存最小化”的一般构想是:相依于声明式,不要相依于定义式。具体实现依赖于Handle classes和Interface classes这里有两个类,一个类是接口类

2021-03-21 23:25:15 132

原创 《Effective C++》 读书笔记 条款26-30

Effective C++ 26-30 Note条款26:尽可能延后变量定义式的出现时间等到出现有意义值时再定义,避免无意义的默认构造函数(习惯使用拷贝构造函数)条款27:尽量少做转型动作C++提供的四种新式转型方法宁可使用新式转型,也不要使用旧式转型。前者很容易辨别出来,而且也比较有着分门别类的职掌如果可以,尽量避免转型,特别是在重视效率的代码中避免dynamic_castsdynamic_cast用于将一个基类转换为派生类,之所以需要它,是因为你想在一个你认为是派生类的基类对象中

2021-03-21 23:24:04 104

原创 《Effective C++》 读书笔记 条款21-25

Effective C++ 21-25 Note条款21:必须返回对象时,别妄想返回其reference在看到一个reference表达式的时候,应该立即问自己:它的另一个名称是什么?绝不要返回pointer或reference指向一个local stack对象local stack对象就是在函数中不用new得到的局部变量,这个局部变量会在退出函数时自动销毁。返回的指针或引用会指向一个不存在的对象。绝不要返回以一个reference指向一个heap-allocated对象heap-allocat

2021-03-21 23:22:43 169

原创 《Effective C++》 读书笔记 条款16-20

Effective C++ 16-20 Note条款16:成对使用new和delete时要采用相同形式如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中没有使用new,一定不要在相应的delete表达式中使用[]单一对象的内存布局与数组的内存布局不一样,数组需要额外的空间记录数组大小,可以把两者的内存情况理解为下图:如果对一个单一对象使用delete[],编译器会按照删除数组的形式寻找对应的n,读取到本不应该存在的n。然后错误的多次析构。而对数组对

2021-03-14 12:12:08 116

原创 《Effective C++》 读书笔记 条款11-15

Effective C++ 11-15 Note条款11:在operator=中处理“自我赋值”确保当对象自我赋值时,拷贝赋值函数有良好的行为。其中的技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap比较“来源对象”和“目标对象”:复制:pb在new操作之后已经指向了一块新的内存地址,所以delete原来地址也是没问题的。copy-and-swap:第一个版本为引用版本,需要利用拷贝构造函数构造一个临时对象,然后让源数据与该临时对象进行交换

2021-03-14 12:03:04 111

原创 《Effective C++》 读书笔记 条款6-10

Effective C++ 6-10 Note条款06:若不想使用编译器自动生成的函数,就明确拒绝在老版的C++中,将不想自动生成的函数声明为private并且不定义在当前版本的C++中,可以使用delete修饰符进行修饰条款07:为多态基类声明virtual析构函数带多态性质的基类应该声明一个虚析构函数,如果类带有任何虚函数,它就应该有一个虚析构函数当出现基类指针或引用指向派生类对象时,如果析构函数不为虚函数,那么调用的就是静态对象的析构函数,也就是基类的析构函数,这会导致派生类的派生部分没

2021-03-12 10:21:46 115

原创 《Effective C++》 读书笔记 条款1-5

Effective C++ 1-5条款01:视C++为一个语言联邦C++大体上由四个次语言组成:C、object-oriented C++、Template C++、STL条款02:尽量以const、enum、inline替换 #defineconst替换#define x 1.653当上述语句发生错误时,编译器只会报告1.653出错,而不是报告x出错。在大工程环境下,只凭1.653这个数字去debug十分费劲。建议使用const替换上述语句enum替换:the enum hack在类里面

2021-03-12 00:09:11 77

原创 《C++ Primer》 读书笔记——第十九章 特殊工具与技术

第十九章 特殊工具与技术19.1 控制内存分配1. 重载new和delete执行new表达式的三步操作:调用operator new的标准库函数,分配一块内存空间在内存空间上使用构造函数构造对象,初始化返回指向该对象的指针new和delete接口malloc函数与free函数当定义自己的new和delete函数时,需要用到malloc函数和free函数2. 定位new表达式向new中传入指定内存地址,允许我们在一个特定的、预先分配的内存地址上构造对象19.2 运行时类型识

2021-03-08 22:24:54 135

原创 《C++ Primer》 读书笔记——第十八章 用于大型程序的工具

第十八章 用于大型程序的工具18.1 异常处理1. 抛出异常try、throw、catch(踹扔抓)栈展开寻找对应的catch语句的过程称之为栈展开没找到相应的catch语句,程序会终止栈展开过程中对象被自动销毁栈展开可能会跳过某个局部块,此时该块里面的所有局部对象都将被销毁析构函数与异常析构函数不能抛出自己处理不了的异常,更近一步,析构函数最好不要抛出异常异常对象完全类型简单来说就是在throw语句使用之前已经定义好的类。只声明没有定义就是不完全类型不要抛出一个指

2021-03-08 21:10:11 108

原创 《C++ Primer》 读书笔记——第十七章 标准库特殊设施

后面三章划重点的截图会多一些,我的水平太差,现在还无法用自己的语言描述这些概念…第十七章 标准库特殊设施17.1 tuple类型类似于pair的概念,将一堆变量打包装进一个tuple里面1. 定义和初始化tupletuple是一个模板,需要指出所有成员的类型2. 必须使用直接初始化3. 访问tuple成员使用 get() , i表示一个正整数17.2 bitset 类型方便的进行位运算,处理二进制数1. 定义和初始化 bitsetbitset是一个模板类,需要给出二进制数

2021-03-08 15:21:13 137

原创 《C++ Primer》 读书笔记——第十六章 模板与泛型编程

第十六章 模板与泛型编程16.1 定义模板1. 函数模板写法在函数开头加上:template 其中模板参数T表示要传入的类型实例化函数模板当编译器实例化一个模板时,它使用实际的模板实参代替对应的模板参数来创建出模板的一个新“实例”。(创建一个新的版本)非类型模板参数非类型模板参数是一个值而非一个类型inline和constexpr修饰的函数模板inline在模板参数列表之后,在函数返回类型之前泛型编码的两个重要原则第一个原则是为了避免复制从而提高效率,同时保证不更改引用

2021-03-07 22:06:48 147

原创 《C++ Primer》 读书笔记——第十五章 面向对象程序设计

第十五章 面向对象程序设计15.1 OOP:概述1. 面向对象的的核心思想是数据抽象、继承和动态绑定通过使用数据抽象将类的接口与实现分离。使用继承,定义相似类型并对其相似关系建模。使用动态绑定,在一定程度上忽略相似类型的区别,以统一的方式使用它们的对象。2. 继承的写法:类派生列表3. 虚函数的写法函数返回值类型前加上virtual修饰符15.2 定义基类和派生类1. 虚函数的解析过程发生在运行时虚函数存在动态绑定,需要在运行时才能确定执行该函数的对象到底是基类还是派生类。而其它

2021-03-07 20:44:01 294

原创 《C++ Primer》 读书笔记——第十四章 重载运算与类型转换

第十四章 重载运算与类型转换14.1 基本概念• 重载运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。• 如果一个运算符函数是成员函数,则它的第一个运算对象绑定到隐式的this指针上• 对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数:这一约定意味着当运算符作用于内置类型的运算对象时,我们无法改变该运算符的含义。1、可以重载的运算符通常情况下,不应该重载逗号,取地址,逻辑与和逻辑或运算符。上述运算符的重载版本无法保存求值

2021-03-05 11:56:29 196 1

原创 《C++ Primer》 读书笔记——第十三章 拷贝控制

第十三章 拷贝控制13.1 拷贝、赋值与销毁1、拷贝构造函数①、基本概念拷贝构造函数的第一个参数是自身的引用,并且任何额外的参数都有默认值。合成拷贝构造函数:如果没有为类定义拷贝构造函数,则编译器会为我们定义一个,称之为合成拷贝构造函数。一般情况,合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中②、拷贝初始化直接初始化:使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数拷贝初始化:将右侧运算对象拷贝到正在创建的对象中拷贝初始化发生的情况:③、为什么拷贝构造函数的参

2021-03-05 08:55:15 168 1

原创 《C++ Primer》 读书笔记——第十二章 动态内存

第十二章 动态内存12.1 动态内存和智能指针1、new和deleteC++的动态内存管理是通过new和delete来完成的new:在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化delete:接受一个动态对象指针,摧毁该对象,并释放与之相关的内存我们经常会忘记delete,所以推荐使用智能指针2、三种智能指针shared_ptr:允许多个指针指向同一个对象unique_ptr:“独占”所指向的对象weak_ptr:是一种弱引用,指向shared_ptr

2021-03-04 11:39:11 112 1

原创 《C++ Primer》 读书笔记——第十一章 关联容器

第十一章 关联容器map和multimap定义在头文件map中;set和multiset定义在头文件set中无序容器则定义在头文件unordered_map和unordered_set中11.1 使用关联容器1、使用map的简单例子for循环读取map得到的是pair类型2、使用set的简单例子map和set是模板,都需要指定元素类型11.2 关联容器概述1、关联容器对关键字类型的限制2、有序容器的关键字类型满足严格弱序3、自定义操作的set需要自己做一个函数,这个函数

2021-02-26 17:15:21 86

原创 《C++ Primer》 读书笔记——第十章 泛型算法

第十章 泛型算法10.1 概述1、与泛型算法相关的头文件大多数算法定义在头文件algorithm中头文件numeric定义了数值泛型算法2、算法不会执行容器操作算法不执行容器操作(上一章介绍的容器函数),而是使用迭代器。迭代器的使用令算法不依赖于容器类型(有些容器有这个函数,有些容器没有这个函数)10.2 初始泛型算法1、accumulate设置和的初始值,计算给定范围内的和它将第三个参数作为求和的起点,并且默认序列中元素的类型与第三个参数可以相加,并且类型兼容。2、对于只读算法

2021-02-26 16:40:33 99

原创 《C++ Primer》 读书笔记——第九章 顺序容器

第九章 顺序容器9.1 顺序容器概述一般情况下推荐使用vector9.2 容器库概略所有容器库通用的操作1、const类型的迭代器当不需要进行写访问时,最好使用cbegin和cend2、容器的定义和初始化3、容器间的拷贝问题将一个新容器创建为另一个容器的拷贝的方法有两种:可以直接拷贝整个容器;或者拷贝一个由迭代器指定的元素范围。直接拷贝容器需要类型相同才能够拷贝。而通过迭代器拷贝只需要类型兼容就可以。4、array具有固定大小array的大小也是类型的一部分在对arra

2021-02-26 12:36:44 103

原创 《C++ Primer》 读书笔记——第八章 IO库

第八章 IO库8.1 IO类1、IO对象无拷贝或赋值我们不能拷贝或对IO对象赋值2、IO流的条件状态可以使用循环判断流条件来读取文件3、管理输出缓冲endl、ends、flush8.2 文件输入输出1、fstream特有的操作2、创建文件流创建文件流时,如果给构造函数一个默认的文件名参数的话,就默认当作已经调用了open函数。否则需要在之后关联后再调用open函数。3、可以用子类代替父类fstream继承自iostream, 所以可以将fstream当作函数参数传入需

2021-02-26 11:49:24 73

原创 《C++ Primer》 读书笔记——第七章 类

第七章 类7.1 定义抽象数据类型1、抽象数据类型只能访问函数,不能访问成员变量的类称为抽象数据类型2、*this当返回值为*this时,返回的是调用该方法实例的引用类型(左值)。3、IO类型的参数不能被拷贝IO类型作为函数参数时,只能使用引用而不能使用拷贝。4、默认构造函数只有当类没有声明任何构造函数时,编译器才会生成默认的构造函数5、构造函数初始值列表在构造函数中,函数参数后使用冒号以及成员变量名加括号初始值的形式为类的成员变量赋初始值因为构造函数的目的就是初始化成员变量,所

2021-02-26 11:12:20 175

空空如也

空空如也

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

TA关注的人

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