
C++复习
C++复习笔记
知报
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++泛型算法
泛型算法 = template + 迭代器 + 函数对象特点一:泛型算法的参数接收的都是迭代器特点二:泛型算法的参数还可以接收函数对象sort,find,find_if,binary_search,for_each绑定器+二元函数对象 = 一元函数对象bind1st:把二元函数对象的operator(a,b)的第一个形参绑定起来bind2nd:把二元函数对象的operator(a,b)的第二个形参绑定起来#include <iostream>#include <algori原创 2020-09-10 23:05:27 · 235 阅读 · 0 评论 -
有序关联容器
头文件:#inlucde #include 底层数据结构:红黑树#include <iostream>#include <set>#include <map>using namespace std;int main(){ set<int> set; for (int i = 0; i < 20; ++i) { set.insert(rand() % 20 + 1); } for (原创 2020-09-09 22:41:59 · 252 阅读 · 0 评论 -
无序关联容器
无序关联容器底层:哈希表 增删查时间复杂度都是O(n);set:集合 key map:映射表 [key,value]unordered_set :单重集合unordered_multiset:多重集合unordered_map:单重映射表unordered_multimap:单充映射表使用无序关联容器包含的头文件#include <unordered_set>#include <uordered_map>**set集合:**常用方法函数:增加:insert原创 2020-09-09 17:09:48 · 184 阅读 · 0 评论 -
栈、队列以及优先级队列的容器配置相关问题
怎么理解这个适配器?1、适配器底层没有自己的数据结构,它是另外一个容器的封装,它的方法,全部由底层依赖的容器进行实现。2、没有实现自身的迭代器。为什么queue和s’tack底层不依赖vector而以来deque呢?1、vector的初始内存效率太低了,每次都是二倍扩容,deque的第二维默认是4096/sizeof(int)=1024个数组空间,不需要多次扩容。2、对于queue来说,需要支持尾部插入,头部删除,deque这两项操作的时间复杂度都是O(1),如果依赖vector,其底层出队效率很原创 2020-09-08 21:54:43 · 192 阅读 · 0 评论 -
vector容器与deque、list容器的对比
vector和deque之间的区别?1.底层数据结构:vector特点:动态数组,内存是连续的,2倍的方式进行扩容;deque特点:动态开辟的二维数组空间,内存并不连续,第二维是独立new出来的,属于分段连续。固定长度,扩容的时候,第一维的数组进行二倍扩容;2.前中后删除插入元素的时间复杂度:中间插入删除都是O(n),末尾插入删除都是O(1),头插deque的时间复杂度是O(1),vector是O(n);3.对于内存的使用效率vector需要的内存空间必须是连续的,deque可以分块进行数据存原创 2020-09-05 23:36:22 · 214 阅读 · 0 评论 -
deque与list容器简单介绍
deque:双端队列容器底层数据结构:动态开辟的二维数组,一维数组从2开始,以二倍的方式进行扩容,每次扩容后,原来第二维的数组,从新的第一维的下标oldsize/2开始存放,上下都预留相同的空行,方便支持deque的首尾元素添加。#include deque deq;增加:deq.push_back(20);从末尾添加元素 时间复杂度O(1)deq.push_front(20);从首部添加元素 时间复杂度O(1)deq.insert(it,20);在指向的位置添加元素,时间复杂度O(n)原创 2020-09-05 23:09:28 · 491 阅读 · 0 评论 -
vector容器
底层数据结构:动态开辟的数组,每次以原来空间大小的二倍进行扩容。头文件:#include < vector >增加:vec.push_back(20);//向容器末尾添加元素,时间复杂度O(1),可能导致容器扩容vec.insert(it, 20);//在迭代器的位置插入元素,每次插入都会导致数据位置移动,时间复杂度O(n)删除:vec.pop_back();//末尾删除元素,时间复杂度O(1)vec.erase(it);//删除迭代器指向的元素,时间复杂度O(n)查询:o原创 2020-09-05 21:57:51 · 959 阅读 · 0 评论 -
C++的四种类型转换
C++语言级别提供了四种类型转换方式,分别是:const_cast:去掉常量属性的一个类型转化static_cast:提供编译器认为安全的类型转换,编译时期的类型转换reinterpret_cast:类似于C风格的强制类型转换dynamic_cast:主要用在继承结构中,可以支持RTTI类型识别的上下转换,属于运行时期的类型转换const_cast例子:int main(){ const int a = 10; int *p1 = (int *)&a; int原创 2020-09-05 14:22:02 · 457 阅读 · 0 评论 -
多态的应用原理笔记
如何解释多态:静态(编译时期)的多态:函数重载:bool compare (int, int) {}bool campare(double, double) {}在编译阶段确定好调用的函数版本campare(10,20); call compare_int_intcampare(10.5,10.5); call campare_double_doubel模板(函数模板与类模板):templatebool campare(T a, T b) {}campare(10,20); =&g原创 2020-09-02 23:01:14 · 104 阅读 · 0 评论 -
虚函数以及静态绑定与动态绑定简单总结
一个类添加了虚函数,对这个类有什么影响?一个类里面定义了虚函数,那么编译阶段,编译器会给这个类类型产生一个唯一的虚函数表(vftable),虚函数表里面储存的内容主要是RTTI指针和虚函数的地址。当程序运行时,每张虚函数表都会加载到内存的.rodata区。一个类里定义了虚函数,那么这个类定义的对象,其运行时,内存中开始的部分会多储存一个vfptr虚函数指针,指向对应类型的虚函数表。一个类型定义的n个对象,vfptr指向的都是同一张虚函数表。一个类中定义多个虚函数,不会影响对象内存的大小,只会影响虚函数原创 2020-09-02 15:35:15 · 1455 阅读 · 0 评论 -
队列的内存池简单实现(new与delete的重载)
#include <iostream>using namespace std;template <typename T>class Queue{public: Queue() { _front = _rear = new QueueItem(); } ~Queue() { QueueItem *cur = _front; while (cur != nullptr)原创 2020-08-30 22:46:42 · 229 阅读 · 0 评论 -
vector容器的迭代器实现
#include <iostream>using namespace std;template<typename T>class vector{public: vector(int size = 10) { _first = new T[size]; _last = _first; _end = _first + size; } ~vector() { delete[]原创 2020-08-28 21:54:40 · 769 阅读 · 0 评论 -
String对象的迭代器iterator实现
class String{public: String(const char *p = nullptr) { if (p != nullptr) { _pstr = new char[strlen(p) + 1]; strcpy(_pstr, p); } else { _pstr = new char[1]; *_原创 2020-08-27 23:19:45 · 1005 阅读 · 1 评论 -
String类的实现
#include <iostream>using namespace std;class String{public: String(const char *p = nullptr) { if (p != nullptr) { _pstr = new char[strlen(p) + 1]; strcpy(_pstr, p); } else {原创 2020-08-27 17:19:29 · 100 阅读 · 0 评论 -
C++编译链接原理简单介绍
编译链接阶段主要分为预编译、编译、汇编、链接这几个阶段。预编译阶段1、删除宏定义并做文本替换2、递归展开头文件3、处理预编译指令,例如#if、#endif4、删除注释5、添加行号和文件标识6、保留#pragma的命令,因为编译器还需要使用编译阶段1、词法分析2、语法分析3、语义分析4、对代码进行优化(提高效率、不可控)5、生成相应的汇编代码汇编阶段将汇编语义翻译成操作系统可以识别的二进制文件汇编阶段并没有对弱符号进行处理,也没有对符号表里面外部符号进行处理,指令段里面也存在虚原创 2020-07-23 23:25:07 · 230 阅读 · 0 评论 -
C++复习之迭代器失效的问题
迭代器的失效问题第一种场景:首先咱们先用库里面自带的vector容器,把容器中所有偶数删除#include <iostream>#include <vector>using namespace std;int main(){ vector<int> vec; for (int i = 0; i < 20; ++it) { vec.push_back(rand() % 100 + 1); } //把原创 2020-05-21 21:53:15 · 233 阅读 · 0 评论 -
C++复习之用类模板实现STL中的一个顺序容器vector
恩,名字就要要取的长!!!!下面的程序缺少空间配置器allocator。有关空间配置器这方面的内容以后再说。#include <iostream>using namespace std;template<typename T>class vector{public: vector(int size = 10) { _first = new T[size]; _last = _first; _end = _原创 2020-05-19 04:26:27 · 237 阅读 · 0 评论 -
C++复习之类模板
用模板来实现一个顺序栈//类模板#include <iostream>#include <cstring>template<typename T>class SeqStack//模板名称+类型参数列表 = 类名称{public: //构造与析构函数名不用加<T>,其他出现模板的地方都加上类型参数列表 SeqStack(int size = 10) : _pstack(new T[size]) , _原创 2020-05-17 04:53:16 · 187 阅读 · 0 评论 -
C++复习之模板非类型参数
模板的非类型参数都是常量,只能使用,而不能修改,而且必须是整数(地址/引用也可以)类型。下面举一个简单的例子:#include <iostream>#include <cstring>template<typename T,int SIZE>//SIZE就是模板的非类型参数void sort(T *arr)//冒泡{ for (int i = 0; i < SIZE; ++i) { for (int j = 0; j &原创 2020-05-17 03:41:56 · 209 阅读 · 0 评论 -
C++复习之函数模板
模板的意义:对类型也可以进行参数化函数模板:把处理不同类型的公共逻辑抽象成函数,就得到了函数模板。不进行编译,因为类型不知道模板的实例化:函数调用点进行实例化,会生成一个真正的函数模板函数:由函数模板实例化出来的函数,需要被编译器所编译模板的实参推演:可以根据用户传入的实参类型,来推导出模板类型参数的具体类型。模板的特例化:特殊(不是编译器提供的,而是用户提供的)的实例化模板函数、模板的特例化、非模板函数的重载关系:编译器优先把compare处理成函数名字,没有的话,采取找compare模板/原创 2020-05-16 22:16:54 · 175 阅读 · 0 评论 -
C++复习之this指针和成员方法之间的关系
普通成员方法1.属于类的作用域2.调用该方法时,需要依赖一个对象(常对象不是无法调用的)3.可以任意访问对象的私有成员变量4.会产生this指针—>“类名” *thisstatic静态成员方法1.属于类的作用域2.用类名作用域来调用方法3.可以访问对象的任意私有成员,但是仅限于不依赖对象的成员(只能调用其他的static静态成员)4.没有this指针普通成员方法和静态成员方法最核心的区别就是编译器会给普通成员方法添加一个this形参变量,而静态方法不会生成this形参。如果我们方法原创 2020-05-14 16:51:12 · 195 阅读 · 0 评论 -
C++复习之嵌套类型设计的构造函数实现
构造函数函数的初始化列表#include <iostream>using namespace std;class CDate{public: //“CDate”: 没有合适的默认构造函数可用 CDate(int y, int m, int d)//自定义了构造函数 { _year = y; _month = m; _day = d; } void show() { cout原创 2020-05-14 00:00:50 · 1560 阅读 · 0 评论 -
C++复习之String和队列代码的实现
String类型#include <iostream>using namespace std;class String{public: String(const char *str = nullptr)//普通构造函数 { if (str != nullptr) { m_data = new char[strlen(str) + 1]; strcpy(m_data,原创 2020-05-11 16:46:52 · 792 阅读 · 0 评论 -
C++复习之深拷贝与浅拷贝
浅拷贝还是顺序栈#include <iostream>using namespace std;class SeqStack{public: //构造函数 SeqStack(int size = 10) { cout << this << " SeqStack() " << endl; _pstack = new int[size]; _top = -1; _size = siz原创 2020-05-10 03:13:36 · 156 阅读 · 0 评论 -
C++复习之构造与析构函数
这里我们首先用OOP实现一个顺序栈#include <iostream>using namespace std;class SeqStack{public: void init(int size = 10) { _pstack = new int[size]; _top = -1; _size = size;...原创 2020-05-08 04:02:12 · 170 阅读 · 0 评论 -
C++复习之类和对象、this指针
面向对象(OOP)语言的四大特征:抽象,封装,继承,多态C语言中:各种各样函数的定义C++中:类,实体的抽象类型在C++中,我们通过分析实体的属性和行为,得到它的ADT(abstract,data,type)。我们就可以把ADT输出成类。类,可以根据其属性输出成成员变量,行为输出成成员方法。这时候类依然是抽象类型,只有通过类去实例化出的对象,才代表了现实中的实体。实例:通过一个类去描...原创 2020-05-07 23:53:05 · 146 阅读 · 0 评论 -
C++复习之理解C++中的new和delete
new/delete和malloc/free的区别是什么?int main(){ //malloc/free int *p = (int*)malloc(sizeof(int)); if(p == nullptr) { return -1; } *p = 20; free(p); //new/delete int *p1 = new int(20); int *p2 =...原创 2020-05-06 03:32:39 · 147 阅读 · 0 评论 -
C++复习之初识引用
什么是引用引用,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价。1.&不是求地址运算符,而是起标志作用2.引用的类型必须和其所绑定的变量的类型相同3.引用相当于变量或对象的别名,因此不能再将已有的引用名作为其他变量或对象的名字或别名引用与指针的区别引用是最安全的指针1.引用是必须初始化的,指针可以不用。在汇编层面,引用与指针的指令没有任何...原创 2020-05-06 02:26:56 · 216 阅读 · 0 评论 -
C++复习之const与指针的结合应用
const修饰的量常出现的错误是:(1)常量不能再作为左值(直接修改常量的值)(2)不能把一个常量的地址泄露给一个普通的指针或者普通的引用变量(间接修改常量的值)1.const和一级指针的结合C++语法规范里有这么一句话:const修饰的是离他最近的类型常见的const修饰主要有一下几种情况:(1) const int *p;*p不能被改变,也就是指针的指向不能被改变。指针可以指向任...原创 2020-05-04 02:52:05 · 239 阅读 · 0 评论 -
C++复习之const在C与C++中的区别
1.const怎么理解const修饰的变量不能够再作为左值,即变量初始化完成后,值不能被修改。2.C和C++中const的区别在C中,const修饰的量,可以不用初始化,且不再叫常量,叫做常变量。虽然不再能作为左值,但是可以通过修改内存的方式去修改他的值。//C语言中int main(){ const int a = 20; int array[a] = {}; int *p =...原创 2020-05-01 15:31:42 · 156 阅读 · 0 评论 -
C++复习之函数重载
函数重载1.什么是函数重载?(1)一组函数,其中函数名相同,参数列表的个数或者类型不同。(2)一组函数要称得上重载,一定先是处在同一个作用域当中。(3)const或volatile的时候,会对形参类型有影响例如下面两个函数产生的符号就是相同的void fun(int a) {}void fun(const int a) {}而下面两个函数产生的符号就是不相同的void fun(...原创 2020-04-30 15:43:23 · 299 阅读 · 0 评论 -
C++复习之内联函数
内联函数与普通函数的区别内联函数在编译过程中,没有函数调用的开销,在函数的调用点直接把函数的代码进行展开处理。inline函数如果内联成功,在符号表内不再产生相应的函数符号。普通函数在函数调用点有调用过程,进行参数压栈,函数栈帧的开辟和回退过程,有函数调用的开销。如果一个函数在短时间内被大量调用,且函数本身比较简答,建议将此函数设置为内联函数。注意:inline只是建议编译器把这个函数处...原创 2020-04-30 12:42:57 · 185 阅读 · 0 评论 -
C++复习之容器空间配置器allocator的实现
#include <iostream>using namespace std;//容器的空间配置器allocator//做四件事情:内存开辟与释放 对象构造与析构//定义容器的空间配置器,和C++标准库的allocator实现一样template<typename T>struct Allocator{ T* allocate(size_t size)//负责内存开辟 { return (T*)malloc(sizeof(T) *原创 2020-06-18 02:56:16 · 233 阅读 · 0 评论