
C++
文章平均质量分 73
《C++ primer》,《Effective C++》,《STL 源码剖析》,《深度探索C++ 对象模型》读书笔记
lingqing97
这个作者很懒,什么都没留下…
展开
-
《STL源码剖析》chapter8 配接器
配接器概述STL提供的配接器可以分为三类:iterator adapter:改变迭代器的接口container adapter:改变容器接口function adapter:改变仿函数的接口iterator adapter在STL中iterator adapter又可以分为三类:insert iterators:包括back_inserter,front_inserter和inserter三种reverse iterator:将迭代器的移动行为倒转stream iterators:将原创 2021-02-26 16:05:10 · 116 阅读 · 0 评论 -
《STL源码剖析》chapter7仿函数
仿函数概述仿函数,后来也被称为函数对象,是一种具有函数特质的对象。任何应用程序欲使用STL内建的仿函数,都必须含入<functional>头文件,SGI则将它们实际定义于stl_function.h文件中。STL仿函数以操作数划分,分为一元和二元仿函数,在stl_functional.h中定义了两个class分别代表一元仿函数和二元仿函数。template<class Arg,class Result>struct unary_function{ //一元函数父类原创 2021-02-22 17:30:21 · 124 阅读 · 0 评论 -
《STL源码剖析》chapter6 算法
STL算法概述所有泛型算法的前两个参数都是一对迭代器,通常称为first和last,用以标示算法的操作区间,该区间是一个前闭后开区间,即[first,last)。由前面章节我们知道,STL中迭代器可以分为5类,在每一个STL算法的声明中,都表现出它所需要的最低程度的迭代器类型。所有数值算法,包括adjacent_difference(),accumulate(),inner_product(),partial_sum()等等,都实现于stl_numeric.h文件中,这是个内部文件,STL规定用户必须原创 2021-02-22 16:40:04 · 88 阅读 · 0 评论 -
《STL源码剖析》chapter5 关联式容器hash_table
hash table 简介hash table是一种用空间换时间的数据结构,其采用hash functions(散列函数)将某一元素映射为一个"大小可接受的索引"。使用hash function会带来一个问题,即不同的元素被映射到相同的位置(亦即有相同的索引),这便是所谓的“碰撞”问题。解决碰撞问题的方法有许多种,包括线性探测,二次探测,开链等做法。在STL hash table中采用开链的做法来解决冲突:定义一个hash table,同时每个表格元素中维护一个list。虽然针对list而进行的搜寻只原创 2021-02-17 21:30:37 · 131 阅读 · 0 评论 -
《STL源码剖析》chapter5 关联式容器set与map
关联式容器setset底层采用RB-tree实现,其键值就是实值,实值就是键值。同时,我们不可以通过set的迭代器改变set的元素值,因为set元素值就是其键值,关系到set元素的排列规则。在set的源代码中,set<T>::iterator被定义为底层RB-tree的const_iterator,杜绝写入操作。标准的STL set使用RB-tree作为底层机制,其所开放的各种操作接口都只是转调用RB-tree的操作行为。set不允许两个元素有相同的键值,所以其insert操作调用的是底原创 2021-02-16 21:45:49 · 113 阅读 · 1 评论 -
《STL源码剖析》chapter5 关联式容器概述和红黑树简介
chapter5 关联式容器概述和RB-tree简介关联式容器概述标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表)。其中set,map,multimap,multiset这些容器的底层机制均以RB-tree(红黑树)完成. 而unordered_set,unordered_map,unordered_multimap,unordered_multiset这些容器则是以hash table(散列表)完成的。原创 2021-02-16 15:17:43 · 144 阅读 · 0 评论 -
《STL源码剖析》chapter4 序列式容器之deque,stack和queue
文章目录序列式容器dequedeque概述deque的中控器deque的迭代器deque的数据结构序列式容器stackstack概述序列式容器queuequeue概述总结序列式容器dequedeque概述deque是一种双向开口的连续线性空间。deque和vector的最大差异在于:deque运行常量时间内催起头段进行元素的插入和移除操作deque没有所谓容量的观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。理解deque的关键在于其分段连续,即通过提供的R原创 2021-02-09 17:31:26 · 267 阅读 · 0 评论 -
《STL源码剖析》chapter4 序列式容器之array,forward_list
序列式容器arrayarray概述array只是对c++原本的静态数组进行了泛化封装,其定义如下: template<class T,std::size_t N> struct array{ typedef T value_type; typedef T* pointer; typedef value_type* iterator; typ原创 2021-02-06 20:51:19 · 151 阅读 · 1 评论 -
《STL源码剖析》chapter4 序列式容器之vector
vector概述vector与arry非常相似,不同之处在于array是静态空间,一旦大小设定就不能改变;而vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。vector的迭代器vector维护的是一个连续线性空间,所以使用普通指针就可以作为vector的迭代器。所以vectro提供的是Random Access Iterator。template<class T,class Alloc=alloc>class vector{ public:原创 2021-02-06 16:01:08 · 167 阅读 · 1 评论 -
《STL源码剖析》chapter4 序列式容器之list
序列式容器listlist概述STL中实现的list是数据结构中常提的双向环状链表。设计过list的人都知道,list本身和list所含的节点是不同的结构,需要分开设计。其中STL中list的节点结构如下: //定义链表节点 template<class T> struct __list_node{ __list_node* prev; //指向上一个节点 __list_node* next; //原创 2021-02-05 15:46:40 · 138 阅读 · 0 评论 -
《STL源码剖析》chapter4 序列式容器概述
容器的概述STL中容器分为顺序容器和关联式容器.所谓序列式容器,其中的元素都可序(ordered),但未必有序(sorted)。其中stack和queue由于只是将deque改头换面而成,技术上被归纳为一种配接器(adapter)。下图中使用缩进来表示各种容器之间的复合(composition)关系。比如heap和priority_queue内部都有一个vector,同理stack和queue内部都有一个deque。在c++11中非标准的slist是forward_list,hash_set、has原创 2021-02-05 15:20:14 · 171 阅读 · 0 评论 -
《STL源码剖析》chapter3 迭代器概念与traits编程技法
chapter3 迭代器概念与traits编程技法迭代器设计思维迭代器(iterators) 是一种抽象的设计概念,23个设计模式中有iterator模式,其定义如下:提供一种方法,使之能依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达式。有一个重要的概念需要清楚:设计适当的相应型别,是迭代器的责任(这里的相应型别主要指五种类型,后面会详细介绍).设计适当的迭代器,则是容器的责任,只有容器本身才知道该设计出怎样的迭代器来遍历自己,并执行迭代器的各种行为(前进、后退、取值、取用成原创 2021-02-03 23:30:36 · 147 阅读 · 0 评论 -
《STL源码剖析》chapter2 空间配置器
空间配置器的标准接口为了精密分工,STL allocator将对象构造/析构,内存分配/释放分开来。内存分配操作由allocator::allocate()负责,内存释放操作由alloc::deallocate()负责;对象构造操作由allocator::construct()负责,对象析构操作由allocator::destory()负责。根据STL的规范,以下是allocator的必要接口://一组typedefallocator::value_typeallocator::pointera原创 2021-02-03 20:45:26 · 110 阅读 · 0 评论 -
《STL源码剖析》chapter1 STL概论与版本简介
chapter1 STL 概论与版本简介STL六大组件STL提供六大组件,彼此可以组合套用:容器(container):如vector、list、deque用来存放数据。从实现的角度来看,STL容器是一种class template。算法(algorithm):如sort、search、copy等。从实现的角度来看,STL算法是一种function template。迭代器(iterator):是所谓的"泛型指针",共有五种类型。所有STL容器都附带有自己专属的迭代器。仿函数(functor)原创 2021-02-03 15:46:06 · 183 阅读 · 0 评论 -
《C++ primer》(第5版) chapter15 读书笔记
文章目录15.1 OOP:概述15.2 定义基类和派生类15.3 虚函数15.4 抽象基类15.5 访问控制与继承15.6 继承中的类作用域15.7 构造函数与拷贝控制15.8 容器与继承15.9 文本查询程序再探15.1 OOP:概述面向对象程序设计的核心思想是数据抽象、继承和动态绑定(有时也被称为运行时绑定)通过使用数据抽象,我们可以将类的接口与实现分离使用继承,可以定义相似的类型并对其相似关系建模使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象15.原创 2021-02-03 15:16:58 · 191 阅读 · 0 评论 -
《C++ primer》(第5版) chapter13 读书笔记
文章目录13.1 拷贝、赋值与销毁13.2 拷贝控制和资源管理13.3 交换操作13.4 拷贝控制示例13.5 动态内存管理类13.6 对象移动13.1 拷贝、赋值与销毁一个类定义了五种特殊的成员函数来控制类的对象拷贝、移动、赋值和销毁时做什么拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数如果我们没有为一个类定义拷贝构造函数,编译器会为我们定义一个与合成默认构造函数原创 2021-02-02 17:25:05 · 274 阅读 · 0 评论 -
《C++ primer》(第5版) chapter14 读书笔记
文章目录14.1 基本概念14.2 输入和输出运算符14.3 算术和关系运算符14.4 赋值运算符14.5 下标运算符14.6 递增和递减运算符14.7 成员访问运算符14.8 函数调用运算符14.9 重载、类型转换与运算符总结14.1 基本概念对于二元运算符来说,左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数如果一个运算符函数是成员函数,则它的第一个(左侧)运算对象绑定到隐式的this指针上对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数对于重载的运算符来原创 2021-02-01 19:28:25 · 290 阅读 · 0 评论 -
《C++ primer》(第5版) chapter12 读书笔记
文章目录12.1 动态内存与智能指针12.2 动态数组12.3 使用标准库:文本查询程序12.1 动态内存与智能指针c++中内存可以划分为静态内存,栈内存和堆:静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量,由编译器自动创建和销毁栈内存用来保存定义在函数内的非static对象,由编译器自动创建和销毁堆用来存储动态分配的对象,即那些杂程序运行时分配的对象,动态对象的生存期由程序来控制,当动态对象不再使用时,我们的代码必须显式地销毁它们为了更容易(同原创 2021-02-01 15:25:45 · 139 阅读 · 0 评论 -
《C++ primer》(第5版) chapter11 读书笔记
文章目录11.1 使用关联容器11.2 关联容器概述11.3 关联容器操作11.4 无序容器11.1 使用关联容器关联容器支持高效的关键字查找和访问,两个主要的关联容器类型是map和set标准库提供8个关联容器,这8个容器的不同体现在三个维度上:是一个set,或是一个map要求不重复的关键字,或者允许重复关键字(允许重复关键字的容器名字汇总都有包含单词multi)按顺序保存元素,或无序保存(不保持关键字按照顺序存储的容器的名字都以单词unordered开头)关联容器类型特征原创 2021-01-31 18:52:12 · 108 阅读 · 0 评论 -
《C++ primer》(第5版) chapter10 读书笔记
文章目录10.1 概述10.2 初识泛型算法10.3 定制操作10.4 再探迭代器10.5 泛型算法结构10.6 特定容器算法10.1 概述大多数算法都定义在头文件algorithm中,标准库还在头文件numeric中定义了一组数值泛型算法泛型算法的一个重要编程假定:算法永远不会改变底层容器的大小。算法可能改变那容器中保存的元素的值,也可能在容器内移动元素,但永远不会直接添加或删除元素10.2 初识泛型算法理解算法的最基本的方法就是了解它们是否读取元素、改变元素或是重排元素顺序(见例子一).原创 2021-01-31 16:56:37 · 129 阅读 · 0 评论 -
《C++ primer》(第5版) chapter9 读书笔记
文章目录9.1 顺序容器概述9.2 容器库概览9.3 顺序容器操作9.4 vector对象是如何增长的9.5 额外的string操作9.6 容器适配器9.1 顺序容器概述顺序容器类型vector可变大小数组,支持快速随机访问在尾部之外的位置插入和删除元素可能很慢deque双端数组,支持快速随机访问在头尾位置插入/删除速度很快list双向链表,只支持双向顺序访问在list中任何位置进行插入/删除操作速度都很快forward_list单向链表,只支持单向原创 2021-01-31 14:29:23 · 240 阅读 · 0 评论 -
《C++ primer》(第5版) chapter8 读书笔记
文章目录8.1 IO类8.2 文件输入输出8.3 string流8.1 IO类iostream定义了用于读写流的基本类型,fstrem定义了读写命名文件的类型,sstream定义了读写内存string对象的类型我们不能拷贝或对IO对象赋值由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型,进行IO操作的函数通常以引用方式传递和返回流读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的IO类定义了一些函数和状态标志,可以帮助我们访问和操作流的条件状态(见例子一原创 2021-01-30 20:08:49 · 121 阅读 · 0 评论 -
《C++ primer》(第5版) chapter7 读书笔记
文章目录7.1 定义抽象数据类型7.2 访问控制与封装7.3 类的其他特性7.4 类的作用域7.5 构造函数再探7.6 类的静态成员7.1 定义抽象数据类型成员函数的声明必须在类的内部,它的定义则既可以在类的内部也可以在类的外部定义在类内部的函数是隐式的inline函数成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象,默认情况下this的类型是指向类类型非常量版本的常量指针const关键字放在成员函数的参数列表之后,此时紧跟在参数列表后面的const表示this是一个指向常量原创 2021-01-30 17:09:43 · 272 阅读 · 0 评论 -
《C++ primer》(第5版) chapter6 读书笔记
文章目录函数基础参数传递返回类型和return语句函数重载特殊用途语言特性函数匹配函数指针函数基础一个典型的函数定义包括以下部分:返回类型、函数名称、由0个或多个形参组成的列表以及函数体函数的调用完成两项工作:一是用实参初始化函数对应的形参二是将控制权转移给被调用函数,此时主调函数的执行被暂时中断,被调函数开始执行return语句也完成两项工作:一是返回return语句中的值(如果有的话)二是将控制权从被调函数转移回主调函数局部静态对象在程序的执行路径第一次经过对象定义语句时原创 2021-01-29 22:26:58 · 123 阅读 · 0 评论 -
《C++ primer》(第5版) chapter5 读书笔记
文章目录简单语句语句作用域条件语句迭代语句跳转语句try语句块和异常处理简单语句c++语言中的大多数语句都以分号结束,表达式语句的作用是执行表达式并丢弃掉求值结果语句作用域定义在控制结构当中的变量只在相应语句的内部可见,一旦语句结束,变量也就超出其作用范围了条件语句使用if...else要注意防范悬垂else就c++而言,它规定else与离它最近的尚未匹配的if匹配,从而消除了程序的二义性case关键字和它对应的值一起被称为case标签.case标签必须是整型常量表达式如果原创 2021-01-29 17:13:30 · 123 阅读 · 0 评论 -
《C++ primer》(第5版) chapter4 读书笔记
文章目录4.1 基础4.2 算术运算符4.3 逻辑和关系运算符4.4 赋值运算符4.5 递增和递减运算符4.6 成员访问运算符4.7 条件运算符4.8 位运算符4.9 sizeof运算符4.10 逗号运算符4.11 类型转换4.12运算符优先级表4.1 基础要理解表达式,就要理解运算符的优先级、结合律、以及运算对象的求值顺序c++的表达式要不然是右值,要不然就是左值当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)如果表达式的求值结果原创 2021-01-29 16:30:13 · 368 阅读 · 0 评论 -
《C++ primer》(第5版) chapter3 读书笔记
文章目录3.1 命名空间的using声明3.2 标准库类型string3.3 标准库类型vector3.4 迭代器介绍3.5 数组3.6 多维数组3.1 命名空间的using声明位于头文件的代码一般来说不应该使用using声明,这是因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,那么每个使用了该头文件的文件就都会有这个声明.3.2 标准库类型string标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件,作为标准库的一原创 2021-01-29 11:43:22 · 221 阅读 · 0 评论 -
《C++ primer》(第5版) chapter2 读书笔记
chapter2 变量和基本类型2.1 基本内置类型c++内置数据类型包括:算术类型和空类型两种.其中算术类型也可以划分为整型(包括字符和布尔类型在内)和浮点型.除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned).关于隐式类型转换有以下几点需要注意(见例子一):当把浮点型赋给整数类型时,结果值仅保留浮点数中小数点之前的部分当赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数.当赋给带符号类型一个超出它原创 2021-01-28 21:03:54 · 136 阅读 · 0 评论 -
《Effective c++》Chapter7 读书笔记
Chapter7条款41:了解隐式接口和编译器多态classes和templat都支持接口(interfaces)和多态(polymorphism)对classes而言接口是显式的,以函数签名为中心。多态则是通过virtuzl函数发生于运行期条款42:了解typename的双重意义声明template参数时,前缀关键字class和typename可互换请使用关键字typename标识嵌套从属类型名称;但不得在base class lists(基类列)或member initializati原创 2021-01-23 22:45:15 · 170 阅读 · 0 评论 -
《Effective c++》Chapter6 读书笔记
Chapter6条款32:确定你的public继承塑模出is-a关系"public继承"意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derived class对象也都是一个base class对象.条款33:避免遮掩继承而来的名称derived classes内的名称会遮掩base class内的名称。只要名称相同就会被覆盖,无论函数参数是否相同,也无论是virtual还是non-virtual(见下例)为了让被遮掩的原创 2021-01-22 17:16:26 · 186 阅读 · 0 评论 -
《Effective c++》Chapter5 读书笔记
Chapter 5条款26:尽量可能延后变量定义式的出现时间尽量延后变量的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义知道能够给它初值实参为止更深一层说,以“具明显意义之初值”将变量初始化,还可以附带说明变量的目的//原函数std::string encryptPassword(const std::string& password){ using namespace std; string encrypted; if(password.原创 2021-01-22 15:22:30 · 167 阅读 · 2 评论 -
《Effective c++》Chapter4 读书笔记
Chapter4条款18:让接口容易被正确使用,不易被误用"促进正确使用"的办法包括接口的一致性,以及与内置类型的行为兼容"阻止误用"的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任任何接口如果要求客户必须记得做某些事情,就是有着“不正确使用”的倾向,因为客户可能会忘记做那件事//建立新类型的例子//初始版//初始版可能客户会将month赋予错误的值class Date{ public: Date(int month,int day原创 2021-01-22 15:21:03 · 159 阅读 · 0 评论 -
《Effective c++》Chapter3 读书笔记
Chapter3条款13:以对象管理资源RAII守则:资源在构造期间获得,在析构期间释放为防止资源泄露,使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源两个常被使用的RAII classes分别是shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向nullauto_ptr和tr1::shared_ptr两者都在其析构函数内做delete而不是delete []动作(若需执行delete []原创 2021-01-22 15:20:17 · 159 阅读 · 0 评论 -
《Effective c++》Chapter2 读书笔记
Chapter2条款05:了解C++默默编写并调用哪些函数编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符,以及构造函数编译器产出的析构函数是个non-virtual,除非这个class的base class自身声明有virtual析构函数copy assignmet函数被编译器默认构造出来需要满足以下条件不包含reference成员和const成员某个base classes将copy assignment操作符声明为privat原创 2021-01-22 15:19:38 · 142 阅读 · 0 评论 -
《Effective c++》Chapter1 读书笔记
Chapter1条款01:视c++ 为一个语言联邦C++可以分为四个次语言:C语言Object-Oriented C++(C with class)Template C++(范型编程)STL(标准模板库)条款02:尽量以const,enum,inline替换#define对于单纯常量,最好以const对象或者enums替换#fefine对于形似函数的宏,最好改用inline函数替换#define条款03:尽量可能使用const指向常量的指针有两种书写格式:const原创 2021-01-22 15:18:45 · 159 阅读 · 1 评论