![](https://img-blog.csdnimg.cn/20200529173008579.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
侯捷老师的C++课程笔记
侯捷老师讲的一些课程的个人向笔记。课程内容一般比较简单,以概念为主,要想深入理解还需多学多练
Niu Yutao
非科班转码
展开
-
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 · 330 阅读 · 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 · 208 阅读 · 0 评论 -
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 · 181 阅读 · 0 评论 -
C++STL 体系结构与内核分析(侯捷)——课程笔记(十一)
现在开始了算法的讲解。本部分包括迭代器的类型以及其对算法的影响,还包括一点traits的内容。STL中的Algorithms对Containers一无所知,所以它需要的一切信息都必须从Iterators取得,而Iterators必须能够回答Algorithms的所有提问,才能搭配Algorithms的所有操作。一、iterators的各种iterator_category一共有五种iterator_category,每种category都是一个class,并且它们之间还存在一些继承关系,如下图所原创 2020-08-05 20:27:24 · 213 阅读 · 0 评论 -
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 · 180 阅读 · 0 评论 -
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 · 226 阅读 · 0 评论 -
C++STL 体系结构与内核分析(侯捷)——课程笔记(八)
下面就要开始介绍关联容器了,set,multiset,map,multimap底层都是由红黑树实现的,而unordered版本的这四种容器都是由hashtable实现的。本部分包括关联容器这个大主题的第一部分内容:红黑树。注意:这里的介绍不包括红黑树的着色、旋转等原理,介绍的主题是结合G2.9的源代码,看红黑树的成员、接口等实现方式。一、红黑树的G2.9实现红黑树是一种自平衡二叉搜索树,之前学习过AVL树,但为什么红黑树在实际工程中应用这么广泛后面还是要了解一下。红黑树有几个需要遵守的规则:比如节点原创 2020-08-02 17:20:29 · 223 阅读 · 0 评论 -
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 · 230 阅读 · 0 评论 -
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 · 202 阅读 · 0 评论 -
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 · 225 阅读 · 0 评论 -
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 · 254 阅读 · 0 评论 -
C++STL 体系结构与内核分析(侯捷)——课程笔记(三)
简单介绍了分配器,更细节的地方可能要看内存管理那门课。1.申请内存操作最终都要落在malloc()这个函数上,然后malloc()再去调用相应操作系统的API。operator new()底层就是简单调用了malloc();operator delete()底层调用了free()。malloc()申请的内存块类似下面这个样子(以VC6为例),可以看出有很多额外开销:特别是上面和下面的cookies,如果申请很多相同大小的内存块,就会有很多的cookies是多余的,造成了空间上的浪费。..原创 2020-07-21 16:02:26 · 209 阅读 · 0 评论 -
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 · 355 阅读 · 0 评论 -
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 · 533 阅读 · 0 评论 -
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 · 507 阅读 · 0 评论 -
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 · 604 阅读 · 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 · 420 阅读 · 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 · 390 阅读 · 0 评论 -
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 · 219 阅读 · 0 评论 -
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 · 271 阅读 · 0 评论 -
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 · 353 阅读 · 0 评论 -
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 · 304 阅读 · 0 评论 -
C++11新特性(侯捷)——课程笔记(二)
本部分包括的内容为Variadic Templates(可变模板参数),这部分似乎是个概述,我看到后面有好几节课也是这个主题。原创 2020-07-09 23:49:19 · 622 阅读 · 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 · 608 阅读 · 0 评论 -
C++程序设计兼谈对象模型(侯捷)——课程笔记(六)
这部分主要想谈一下new和delete相关的东西。之前的课程包含的内容有可变模板参数,auto,范围for循环,引用还有对象模型相关的知识,这些都不做总结了,因为讲得比较浅,这些概念之前都比较熟悉了。一、使用new和delete时发生了什么1. new:先分配memory,再调用ctor当使用new表达式时,编译器会先分配内存空间,再调用相应的构造函数,比如当我们写如下的代码时:string *ps = new string("Hello");编译器会将其转化为:string*原创 2020-07-04 22:23:17 · 376 阅读 · 0 评论 -
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 · 170 阅读 · 0 评论 -
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 · 133 阅读 · 0 评论 -
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 · 243 阅读 · 0 评论 -
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 · 252 阅读 · 0 评论 -
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 · 304 阅读 · 0 评论 -
C++面向对象高级编程(侯捷)——OO部分(二)
Delegation(委托) + Inheritance(继承)1. 一个经典的例子,对于一个文档来说,可以同时有多个窗口去观察他。这些观察方式可以是相同的,也可以是不同的,比如对于同一组数据,我们可以开三个窗口,一个显示数据的柱状图,一个显示数据的饼状图,一个显示数据的表格。那么这样的设计应该如何实现呢?下面就是这种设计的一种经典解法,也是经典设计模式中的一种:观察者模式class Subject就是表示数据的类,它和class Observer是委托的关系,也就是class Subject中原创 2020-05-29 01:27:48 · 274 阅读 · 0 评论 -
C++面向对象高级编程(侯捷)——OO部分(一)
一、Composition(复合)表示has-a的关系原创 2020-05-28 22:04:41 · 321 阅读 · 0 评论