自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [Leetcode力扣 142] Linked List Cycle II

一、题目描述给一个链表,如果里面有环,输出环的起点,否则输出空指针二、解法一:判断节点对应的指针是否出现过这是最容易想到的解法,因为一个节点的地址可以唯一确定这个节点,只要沿着链表移动,看节点对应的地址是否出现过就行了,unordered_set比set查找快一点,所以可以用unordered_set。代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * Li

2020-10-22 21:34:10 131

原创 [Leetcode力扣 25] Reverse Nodes in k-Group

一、题目描述k个一组反转链表。本题中链表至少有1个节点,k保证是有效的,即1<=k<=n。二、解法一:使用reverseList函数只考虑O(1)存储空间的办法的话,比较容易想到的就是,每数到k个节点就返回去反转这k个节点。不能边数边反转的原因是:不能确定后面还够不够k个节点,如果不够k个节点的话是不用反转的。假设已经有了反转k个节点的子函数,那么整个过程就可以这样处理:每k个一组的链表反转以后,要得到反转后的链表段的head和tail,设当前的head和tail分别为thi

2020-10-20 21:19:45 190

原创 [Leetcode力扣 206] Reverse Linked List

一、题目描述反转一个单链表。一道非常简单,非常基础的题,然而我某次面试竟然没写出来......所以在这里好好反思总结一下。二、迭代法以“1->2->3->4->5->nullptr”为例。如果链表没有节点或者只有1个节点,那么直接返回即可,不需要做操作,所以最小规模的情况要2个节点。从第2个节点开始迭代,每一次要将当前节点指向上一个head,并且要将head每次都更新为指向当前节点。除此之外还要注意,最开始的head指向的节点一定是尾节点,所以要把开始的

2020-10-19 22:20:15 173

原创 [Leetcode力扣 452] Minimum Number of Arrows to Burst Balloons

一、题目描述给一堆二维闭区间表示气球,问最少用几支箭能把所有气球射爆二、解法:区间贪心

2020-10-10 20:41:37 116

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(十四)

本部分是课程的最后一部分,前面STL的六大部件已经都介绍完毕,最后的内容包含一些标准库周边的内容,都整理到这里。一、一个万用的hashfunction假设定义了一个这样的Customer类:class Customer{public: string fname, lname; int no;};那么自定义其哈希函数有三种方式://方式一:创建可调用类型class CustomerHash{public: std::size_t operator()

2020-08-13 18:57:24 312 1

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(十三)

这部分开始适配器的讲解,讲适配器之前还讲了仿函数,但由于比较简单,所以这里简单提一下仿函数。仿函数就是具有函数特性的class,主要是为算法服务的。STL中有三类仿函数,算术类、逻辑类和相对关系类,下面举几个例子://算术类template <class T>struct plus : public binary_function<T, T, T> { T operator()(const T& x, const T& y) const

2020-08-11 15:27:43 203

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(十二)

本部分内容包括STL中部分算法的介绍。一般来说,算法是个函数模板,具有类似以下的格式:template <typename Iterator>std::Algorithm(Iterator itr1, Iterator itr2, ......){ ......}1. accumulate()accumulate()是累计函数,默认是加,也可以传入自定义操作template <class InputIterator, class T

2020-08-06 17:28:18 172

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(十一)

现在开始了算法的讲解。本部分包括迭代器的类型以及其对算法的影响,还包括一点traits的内容。STL中的Algorithms对Containers一无所知,所以它需要的一切信息都必须从Iterators取得,而Iterators必须能够回答Algorithms的所有提问,才能搭配Algorithms的所有操作。一、iterators的各种iterator_category一共有五种iterator_category,每种category都是一个class,并且它们之间还存在一些继承关系,如下图所

2020-08-05 20:27:24 203

原创 《深入探索C++对象模型》第三章 Data语意学(The Semantics of Data)

先从一个例子开始,假如给定以下class的定义及继承关系:class X { };class Y : public virtual X { };class Z : public virtual X { };class A : public Y, public Z { };则分别对class X,class Y,class Z和class A求sizeof()的值是多少?答案可能不那么直观,因为乍一看这几个类都没有任何成员,所以应该都是空的,但实际上,...

2020-08-04 20:06:43 203

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(十)

本部分包括hashtable介绍,和C++11讲得一样,只包括一些基本概念。一、hashtable原理不同编译器实现不同,这里讲的是GNU的实现。G2.9的hashtable就是使用链地址法解决冲突的哈希表,表长是一个素数,开始值是53,当元素个数超过表长时会自动扩容为大概原先两倍的一个素数。源码如下所示:template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey,

2020-08-04 12:29:24 169

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(九)

本部分内容包括set,multiset,map,multimap。一、set和multisetset的insert()使用的是红黑树的insert_unique(),multiset的insert()使用的是红黑树的insert_qual(),下面是G2.9的set源码:template <class Key, class Compare = less<Key>, class Alloc = alloc>class set{p

2020-08-02 21:46:06 217

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(八)

下面就要开始介绍关联容器了,set,multiset,map,multimap底层都是由红黑树实现的,而unordered版本的这四种容器都是由hashtable实现的。本部分包括关联容器这个大主题的第一部分内容:红黑树。注意:这里的介绍不包括红黑树的着色、旋转等原理,介绍的主题是结合G2.9的源代码,看红黑树的成员、接口等实现方式。一、红黑树的G2.9实现红黑树是一种自平衡二叉搜索树,之前学习过AVL树,但为什么红黑树在实际工程中应用这么广泛后面还是要了解一下。红黑树有几个需要遵守的规则:比如节点

2020-08-02 17:20:29 213

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(七)

本部分内容包括容器deque以及容器适配器stack和queue。一、deque基本原理deque对外表现为两端可以扩充的连续内存块。但其内部实际上是由一个个离散的内存段组成的,术语叫做buffer,这些内存段的头指针被保存在一个vector中,通过deque的迭代器的行为,就可以对外表现为一个连续的内存段。deque的G2.9源码如下:template<class T, class Alloc = alloc, size_t BufSiz = 0>clas

2020-08-01 02:22:33 223

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(六)

本部分内容包括vector的源码探究。一、容器vector概述其源码如下,G2.9版本template <class T, class Alloc = alloc>class vector{public: typedef T value_type; typedef value_type* iterator; typedef value_type& reference; typedef size_t

2020-07-30 22:39:02 190

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(五)

本部分包括traits基础以及iterator traits的介绍一、iterator需要遵循的原则STL中的iterator是关联algorithms和containers的纽带,algorithms想要通过iterator处理元素,有几个iterator必须要回答给algorithms的问题,比如说iterator指向元素的类型,iterator的类别等等,下面是一个例子:template<typename _ForwardIterator> inline void

2020-07-30 10:05:15 215

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(四)

本部分的内容包括list的源码分析。一、G2.9版本的list源码list底层实现为双向循环链表,并且环状链表的尾端还有一个空白节点,代表尾后迭代器指向的节点,用以符合STL前闭后开的原则,其示意图如下:G2.9版本的源码如下:template <class T, class Alloc = alloc>class list{protected: typedef __list_node<T> list_node;public: typede

2020-07-29 22:32:36 238

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(三)

简单介绍了分配器,更细节的地方可能要看内存管理那门课。1.申请内存操作最终都要落在malloc()这个函数上,然后malloc()再去调用相应操作系统的API。operator new()底层就是简单调用了malloc();operator delete()底层调用了free()。malloc()申请的内存块类似下面这个样子(以VC6为例),可以看出有很多额外开销:特别是上面和下面的cookies,如果申请很多相同大小的内存块,就会有很多的cookies是多余的,造成了空间上的浪费。..

2020-07-21 16:02:26 197

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(二)

本部分包括OOP和GP的区别、源码之前的必要基础等等。一、OOP(Object-Oriented programming)与GP(Generic Programming)1. OOP企图将datas和methods关联在一起比如标准库中的list:template <class T, class Alloc = alloc>class list{...... void sort();};我们看到list定义了一个自己的成员函数,那么为什么l

2020-07-20 22:43:35 347

原创 C++STL 体系结构与内核分析(侯捷)——课程笔记(一)

本部分包括课程信息和一些基本概念1. 泛型编程:泛型编程使用template为主要工具,STL就是泛型编程应用的一个绝好示范。2. C++ Standard Library和C++ Standard Template Library的区别:标准库包括STL,可以认为STL主要包含六大部件,除此之外还有一些东西,和STL组合在一起就构成了标准库。下面介绍STL体系结构基础:一、六大部件(Components)1. 六大部件及其关系容器(Container),分配器(Allocator)

2020-07-20 14:50:36 497

原创 [Leetcode力扣 46] Permutations

一、题目描述题意:给定互不相同数字的数组,输出这个数组的全排列。这个问题应该比较基础,但是我没有独立想到任何一种方法。。。下面就是总结一下我见过的方法,并尝试尽量具体地理解。二、解法一:哈希表标记法这种方法可以按照字典序输出全排列,当然这个题目里的元素并不是有序的,但是这种方法输出的也是数组下标的字典序全排列。这种方法的搜索树如下,以[1,2,3]为例:可以看出这种搜索树是下面这种的变体:下面这种序列很容易生成,只需要DFS里面加上for循环就行了,并且只要每次for循环

2020-07-19 22:32:46 156

原创 C++11新特性(侯捷)——课程笔记(十)

本部分将剩余视频内容整合在一起,因为后面有很多缺失的部分:unordered_container缺失了一部分,forward_list缺失,shared_ptr缺失,type traits缺失。一、标准库容器结构其中标红的三个是C++11新增加的容器,其中array和forward_list比较简单,unordered_containers比较重要,可惜缺失了很多内容。1. array其实里面只是一个C语言的数组,只是包装成了一个class的样子。下面是TR1版本(C++03)的源代码,

2020-07-17 16:36:05 477

原创 C++11新特性(侯捷)——课程笔记(九)

本部分的内容包括右值引用(rvalue reference)以及move语义的初步介绍。一、Rvalue referencesRvalue references are a new reference type introduced in C++ that help solve the problem of unnecessary copying and enable perfect forwarding. When the right-hand side of an assignment is a

2020-07-16 23:01:52 570 1

原创 C++11新特性(侯捷)——课程笔记(八)

这部分接着之前讲过的东西,来讲variadic templates,用7个例子来深入探讨可变模板参数。1. 一个简单的print()函数之前讲过,见https://blog.csdn.net/oneNYT/article/details/107219042概述。2. 使用variadic templates 重写printf()逻辑和例子1其实一样,唯一不同的是前面有字符串指示格式,如果不匹配会抛出异常,代码如下:template <typename T, typename...

2020-07-15 00:35:24 396 5

原创 C++11新特性(侯捷)——课程笔记(七)

本部分内容包括decltype和lambda。一、decltypeBy using the new decltype keyword, you can let the compiler find out the type of an expression. This is the realization of the often requested typeof feature. However, the existing typeof implementations were inconsiste

2020-07-14 00:49:54 362

原创 C++11新特性(侯捷)——课程笔记(六)

这部分包括几个小的特性,包括type alias(类型别名)、using的总结、noexcept、override以及final1. type alias(类型别名)类型别名类似于typedef,也是使用using来实现的(1)用于函数指针using func = void(*)(int, int);//相当于typedef void (*func)(int, int);这两句话的意思都是func是一个函数类型(2)type alias can introduce a memb

2020-07-12 01:26:02 209

原创 C++11新特性(侯捷)——课程笔记(五)

这部分的内容是从一个实际问题出发,从alias template(模板别名)引申到template template parameter(模板模板参数)。一、Alias Template一个模板别名的例子如下:template <typename T>using Vec = std::vector<T, MyAlloc<T>>;//我们就可以这样用Vec<int> coll;//这就等同于std::vector<int, MyA

2020-07-11 21:15:27 252

原创 C++11新特性(侯捷)——课程笔记(四)

这部分主要讲=default和=delete的用法。之前还有两个小内容,简单介绍一下:(1)explicit关键字用于多实参构造函数,例如:class P{public: explicit P(int a, int b, int c) { cout << "P(int a, int b, int c)" << endl; }};P p = {1, 2, 3}; //报错,不能将initializer_list隐式转换为P但是如果定义了接受

2020-07-11 02:02:33 325

原创 C++11新特性(侯捷)——课程笔记(三)

这部分主要讲uniform initialization,一致性初始化。之前的内容:(1)类似vector<vector<int>>后面的空格自C++11以来可以去掉;(2)nullptr关键字;(3)auto不做总结。一、概述1. 背景在C++11之前,初始化操作可以用很多种方法来实现,比如说小括号,大括号以及赋值符号,如下所示:Rect r1 = { 3, 7, 20, 25, &area, &print };Rect r1(3, 7, 20,

2020-07-10 22:25:01 287

原创 C++11新特性(侯捷)——课程笔记(二)

本部分包括的内容为Variadic Templates(可变模板参数),这部分似乎是个概述,我看到后面有好几节课也是这个主题。

2020-07-09 23:49:19 591 1

原创 C++11新特性(侯捷)——课程笔记(一)

课程大纲一、语言Variadic Templates,move Semantics,auto,Range-base for loop,Initializer list,Lambdas二、标准库type_traits,Unordered容器,forward_list,array,tuple,Con-currency,RegEx

2020-07-08 20:24:26 572

原创 C++程序设计兼谈对象模型(侯捷)——课程笔记(六)

这部分主要想谈一下new和delete相关的东西。之前的课程包含的内容有可变模板参数,auto,范围for循环,引用还有对象模型相关的知识,这些都不做总结了,因为讲得比较浅,这些概念之前都比较熟悉了。一、使用new和delete时发生了什么1. new:先分配memory,再调用ctor当使用new表达式时,编译器会先分配内存空间,再调用相应的构造函数,比如当我们写如下的代码时:string *ps = new string("Hello");编译器会将其转化为:string*

2020-07-04 22:23:17 351

原创 C++程序设计兼谈对象模型(侯捷)——课程笔记(五)

本部分内容包括模板特化,模板偏特化以及模板模板参数一、specialization(模板特化)//泛化template <class Key>struct hash { ... };//特化template<>struct hash<char> { size_t operator() (char x) const { return x; }};template<>struct hash<int> { s

2020-06-06 01:21:48 156

原创 C++程序设计兼谈对象模型(侯捷)——课程笔记(四)

本部分包括类模板,函数模板以及成员模板。一、class template(类模板)理解起来比较简单template<typename T>class complex{public: complex (T r = 0, T i = 0) : re (r), im (i) { } complex& operator += (const complex&); T real () const { return re; }

2020-06-06 00:10:24 126

原创 [Leetcode力扣 560] Subarray Sum Equals K

一、题目描述题意是给一个数组nums,和一个目标值k,让我们找到子数组内元素之和为k的子数组数量。值得注意的是,题目还给出了测试数据的规模,最大的数组规模为,而一般的OJ一秒内能承受的运算次数为,所以这个题时间复杂度为及以上的算法是肯定通过不了的,所以当题目给定输入规模时,我们就要对提出的算法的时间复杂度的级别心里有数了。二、解法一:暴力法最笨的暴力法解决问题的逻辑,其实就是把题意用计算机语言实现一遍罢了。题目让找所有子数组的和,那么我们就先用两层循环找到所有的子数组subarray{i,

2020-06-03 00:55:11 297

原创 《深入探索C++对象模型》第二章 构造函数语义学(The Semantics of Constructors)

一、default constructor的构造操作先看一个小例子:class Foo { public: int val; Foo *pnext; };此处正确的程序语意是要求Foo有一个默认构造函数,能将它的两个成员初始化为0,那么编译器会为我们合成这样的默认构造函数吗?答案是不会!(事实上,这里合成的默认构造函数是trival的构造函数,也就是它什么也不干,连初始化也不干。在概念上我们把这种构造函数叫做implicit trival default constructors,但实际上这种

2020-06-02 02:30:11 183

原创 《深入探索C++对象模型》第一章 关于对象(Object Lessons)

一、加上封装后的布局成本书的开始给了一个Point3d的例子。如果按C的方法是要定义一个结构体,并定义操作结构体的函数或者宏。之后按C++的做法把Point3d封装起来,可以简单地写一个类,也可以按继承的方式来定义几个类,也可以使用类模板。除了程序设计上的思想上不一样,这两种Point3d实现的功能是完全一样的,那么既然C++的Point3d是封装起来的,这种方式是否在内存布局上增加了额外的成本呢?答案是没有!(当然,这是因为Point3d中包含的只是几个非静态成员,和几个非静态非内联非虚函数的成员

2020-06-01 02:22:43 291

原创 [Leetcode力扣 973] K Closest Points to Origin

一、题目描述中等难度。给一堆二维点,要求输出距离原点(0, 0)最近的K个点二、解法一看到这道题,最容易想到的就是直接对整个vector从小到大排序,然后返回前K个元素即可,我们需要做的只是根据定义重写一个比较函数即可,时间复杂度为O(NlogN)。C++代码如下:class Solution {public: vector<vector<int>> kClosest(vector<vector<int>>& point

2020-05-30 22:14:36 246

原创 C++程序设计兼谈对象模型(侯捷)——课程笔记(三)

本篇说的是function-like classes,也就是行为像函数的class。小括号()学名叫做function call operator,也就是函数调用运算符,重载了operator()的class就是function-like class。下面是一些标准库里面的实例:template <class T>struct identity : public unary_function<T, T>{ const T& operator() (co

2020-05-30 00:57:02 218

原创 C++程序设计兼谈对象模型(侯捷)——课程笔记(二)

本篇内容为pointer-like classes,直译过来就是像指针的类,就比如说C++里面的智能指针,迭代器等都是这样的东西。本篇只讨论这类class的语法,不涉及智能指针,迭代器等的使用细节。一、关于智能指针template <class T>class shared_ptr{public: T& operator*() const { return *px; } T* operator->() const { return

2020-05-29 23:47:03 245

原创 C++程序设计兼谈对象模型(侯捷)——课程笔记(一)

本篇包含内容为转换函数(conversion)以及non-explicit one argument constructor。注意这里的one argument指的是“一个实参”就可以,而不一定只能是一个实参,比如说下文的实例构造函数里就包含一个默认实参。一、转换函数class Fraction{public: Fraction(int num, int den=1) : m_numerator(num), m_denominator(den) { } oper

2020-05-29 21:35:49 287

空空如也

空空如也

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

TA关注的人

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