
C++学习日志
文章平均质量分 89
Willing_hope
我要一往无前~
展开
-
【反转链表 c++实现】
【题目描述】输入链表的头结点,反转链表后输出链表的所有元素;struct ListNode { int val; struct ListNode *next;};【解题思路】1)定义三个辅助指针和一个用于表示翻转链表头结点的指针;2)node指向当前节点、left指向当前节点的前一个节点、right指向当前节点的下一个节点、ReverseHead指向翻转链表的头结点;【】题目来源:牛客网参考博客:https://www.cnblogs.com/wanglei5205/转载 2020-09-11 19:49:38 · 778 阅读 · 0 评论 -
【c++11特性小总结】
一、C++11相比于C++98/03的变化?相比于C++98/03,C++11包含了约140个新特性,能更好的用于系统开发和库开发,语法更加简单化、稳定、安全,且能提高程序员开发效率;二、列表初始化C++11允许使用{}对数组元素进行统一的列表初始值设定,但是对于自定义类型,没有办法使用这样的初始化;(1)内置类型列表初始化直接用{}对变量、数组、标准容器进行初始化;且在{}之前使用等号,其效果和不适用=没有区别;(2)自定义类型列表初始化- 支持单个对象的列表初始化(引用、cons原创 2020-09-09 17:51:07 · 605 阅读 · 0 评论 -
【了解空间配置器、STL关联式容器总结】
一、空间配置器1、什么是空间配置器?空间配置器是为了各个容器高效管理空间(实行空间申请与回收)而设置的内存管理机制;2、为什么需要空间配置器?在模拟实现很多容器的时候发现很多空间都是通过new动态申请的,故:a)动态申请的空间需要用户自己进行释放容易造成内存泄漏;b)频繁申请小块内存容易造成内存碎片,影响程序运行效率;c)malloc和new申请的空间,每块存在额外空间浪费,且申请空间失败没有应对方法;d)未考虑线程安全问题;3、STL空间配置器的实现原理以128作为小块内存原创 2020-09-07 20:33:11 · 242 阅读 · 0 评论 -
【STL中set怎样可以在插入时自动从大到小排序?】
map和set都是按照从小到大的顺序进行排序的,且排序好后不能轻易更改,否则会破坏组织结构;如何让其在插入过程中可以自动的变成由大到小的排序方式呢?tips:set在进行插入的时候一般会按照**<来比较关键字,所以其插入好的状态一般是从小到大;但是对于自定义类型,就需要重载<来支持这一操作;1、使用set前指定比较方式为greater**void test(){ set<int,greater<int>>S2; S2.insert(10.原创 2020-09-07 20:32:23 · 4904 阅读 · 0 评论 -
【哈希结构、哈希应用、unorder系列关联式容器】
一、以哈希为底层结构的unordered系列关联式容器(因为以红黑树为底层结构的,在树中结点非常多的情况下,其查询效率也不是非常的理想,所以c++11中又提供了底层结构为哈希结构的查询效率较高的容器)1、unordered_map(1)特点:存储键值对键和值的映射类型可能不同通过key访问value的速度比map要快,但是迭代效率比较低实现了中括号[]的重载至少有向前的迭代器(2)unordermap和map的对比:map:优点:有序性,这是map结构最大的优点,其元素的有序性在原创 2020-09-06 18:00:50 · 376 阅读 · 0 评论 -
【红黑树】
一、什么是红黑树?红黑树是一种二叉搜索树,但是每个结点上都增加一个颜色,可以是红色或者黑色;通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍(相对于二叉搜索树条件弱化了),因而接近平衡;二、红黑树的性质(1)每个结点不是红色就是黑色;(2)根节点是黑色的;(3)若一个结点是红的那么它的两个孩子结点都是黑色的;(4)每个结点,从该结点到其他所有后代叶节点的路上,所包含的黑色结点数目是相同的;(5)每个叶子节点都是黑的;三、红黑树的定义原创 2020-09-05 17:04:06 · 412 阅读 · 0 评论 -
【关联式容器、键值对、map、set、二叉搜索树、AVL树】
一、关联式容器1、什么是关联式容器?关联式容器也是用来存储数据的,与序列式容器(vector、list【底层是线性序列的数据结构】)不同的是,其存储的是<key,value>类型的键值对,数据检索时比序列式容器更加高效;2、什么时键值对?用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value代表与key对应的信息;STL一共实现了两种不同结构的管理式容器:树形结构和哈希结构;二、树形结构关联式容器以下四种容器的共同特点是原创 2020-08-27 20:42:41 · 562 阅读 · 0 评论 -
【c++类型转换(c语言强制类型转换、c++强制类型转换、)】
一、c语言强制类型转换1、小范围类型转大范围类型的隐式类型转换2、大范围类型转小范围类型的显式类型转换缺陷:转换可视性比较差;二、c++强制类型转换四种强制类型转换的操作符:1、static_cast用于非多态(静态)类型的转换,比如数字类型之间的转换,但不可用于两个毫无关系的类型相互转换;2、reinterpret_cast用于将一种类型转换为另一种类型,比如:将指针转化为一个值放在一个变量里;3、const_cast添加或者删除变量的const属性;4、dynamic_ca原创 2020-08-26 19:00:57 · 380 阅读 · 0 评论 -
【c++智能指针及RAII机制的理解】
一、为什么要有智能指针?因为在平时编程过程中,极大可能会出现两种情况;(1)malloc出来的空间,没有进行释放,存在内存泄漏;(2)如果在malloc和free之间抛异常,那么同样存在内存泄漏问题。该问题称为异常安全问题。二、智能指针原理及使用1、智能指针的实现是基于RAII(资源获取即初始化)。即对象在构造时获取资源,且在对象的声明周期内资源始终有效,最后在对象析构的时候释放资源。即将一份资源管理的责任交给了一个对象。2、使用RAII思想设计智能指针类...原创 2020-08-26 17:27:21 · 1051 阅读 · 0 评论 -
【c++ 异常】
一、c语言处理异常方式1、终止程序(如assert断言)2、返回错误代码(errno中存放的错误代码被返回)二、c++异常1、c++异常的概念 当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或者间接调用者去处理这个错误。2、关于异常的一些关键字 (1)throw:通过throw关键字来抛出异常(2)catch:在想要处理问题的地方,通过异常关键字catch来捕获这个异常(可有多个catch)(3)try:try块中为防止可能抛出异常的代码,其后常常紧跟一个或多个catch原创 2020-08-26 09:36:12 · 205 阅读 · 0 评论 -
【c++多态(虚函数、抽象类、虚表、静/动态绑定)】
一、什么是多态?1、多态基本概念多态就是去完成某个行为,不同的对象会产生出不同的状态。例子:普通人去服装店买衣服是按标准价给钱的,而店内员工在该店买东西,是按照员工价付款的。2、多态的定义(1)在继承中构成多态的两个条件:-必须通过基类指针或引用调用虚函数-被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。class Ordinary{ public: virtue void BuyCloth() { cout<<"全价购买" }};cla原创 2020-08-25 16:33:03 · 296 阅读 · 0 评论 -
【继承练习(实现不被继承的类等)】
1、实现一个不能被继承的类将构造函数私有化或者利用c++11新关键字fininal禁止继承class NonInherit{public://这样派生类没有办法调用基类的构造函数,因此无法继承static NonInherit GetInstance(){return NonInherit();}private:NonInherit()//构造函数私有{}};// C++11给出了新的关键字final禁止继承class NonInherit final{};2、继承和原创 2020-08-16 16:27:39 · 191 阅读 · 0 评论 -
【c++继承、菱形继承、基类派生类对象转换、虚继承等】
一、继承的概念和定义1、继承的概念继承是实现代码可复用性的重要方法,在保留原类的特征基础上做一些扩展,形成新的类,叫做派生类。一个例子:父亲有一套房子,儿子长大了,父子两人共同拥有这套房。但是经过儿子的奋斗,自己又买了一套房,此时儿子可以说是拥有两套房,一套与父亲共享,一套完全属于自己。就像派生类一样,既有父类的东西,又有自己的东西。2、继承的定义(1)定义格式class Student : public Person{ public: int _stuid;原创 2020-08-16 14:08:17 · 396 阅读 · 0 评论 -
【c++的IO流、文件流对象】
1、c语言的输入输出c语言常用scanf():从标准输入读取数据,并将其存放至变量、printf():将指定文字/字符串输出到标准输出设备,设定输出宽度和精度;输入输出缓冲区:(1)屏蔽低级IO实现(2)可实现行读取2、c++的IO流(1)流,是是对一种有序连续且具有方向性的数据( 其单位可以bit,byte,packet )的抽象描述。为了实现这种流,c++定义了I/O标准库。(2)c++实现的庞大类库是以ios为基类,其他类是直接或间接派生自ios类的。(3)cerr、clo原创 2020-08-15 17:43:15 · 1001 阅读 · 0 评论 -
【priority_queue、stack、queue模拟实现】
1、priority_queue模拟实现(1)priority_queue.h#pragma once#include<vector>namespace pz{ template<class T,class Container = vector<T>,class Compare = less<T>> class priority_queue { public: void AdjustUp(int child)//向上调整,大堆原创 2020-08-15 10:43:04 · 190 阅读 · 0 评论 -
【Stl配接器-stack和queue】
一、stack的介绍1、什么是stack(栈)?(1)stack是一种容器适配器,用在先进后出情境下,只能在容器的一端进行插入和删除操作。(2)二、queue的介绍三、priority_queue的介绍四、容器适配器...原创 2020-08-14 19:43:39 · 217 阅读 · 0 评论 -
【Stl-deque】
1、deque简介:(1)deque是双端队列,双端队列是动态大小的序列式容器,可以向两端进行伸缩。(2)deque通常是一种动态数组,允许随机访问。(3)deque在头尾进行插入和删除操作与vector类似,效率较高,但deque并不保证所有元素存储在连续空间中,以指针加偏移进行访问有可能会非法。(4)deque的内部实现比vector更加复杂,同时也使deque在某些特定情况下增长更加高效,尤其是序列比较大,重新分配成本比较高的情况下。2、deque基本使用(1)构造(1)无参构造原创 2020-08-12 08:11:00 · 150 阅读 · 0 评论 -
【list的模拟实现】
1、list的迭代器底层实现用一个类型去封装结点的指针,构成一个自定义类型,然后重载*和++等运算符,使其可以像指针一样进行使用。2、模拟实现list刚开始实现的初步工作就是实现一个双向循环链表,并且指向自己。...原创 2020-08-10 21:26:02 · 205 阅读 · 0 评论 -
【STL-list】
一、list简介1、为什么会有list?作为补充vector缺点而存在。vector是顺序表,list是链表。list和vector的区别实际上就是顺序表和链表的区别。vectro缺点:(1)头部和中部的插入删除效率低,o(N),需要挪动数据。(2)插入数据空间不够需要增容,增容需要开新空间、拷贝数据再释放旧空间,会付出很大的代价。vector的优点:(1)支持下标随机访问,间接支持排序、二分查找,堆算法等等。2、list优缺点:优点:(1)list头部、中间插入不再需要挪动数据,原创 2020-08-08 17:07:27 · 267 阅读 · 0 评论 -
【vector的模拟实现】
1、构造函数//无参构造vector() :_start(nullptr), _finish(nullptr), _endofstorage(nullptr) {}//拷贝构造1 vector(const vector<T>&v) { _start = new T[v.capacity()]; _finish = _start + v.size(); _endofstorage = _start + v.capacity();原创 2020-08-06 10:11:40 · 220 阅读 · 0 评论 -
【STL-vector】
一、vector简介1、 vector是表示可变大小数组的序列容器2、vector和数组一样采用连续空间存储数据,可用下标对其进行访问,效率很高。不同的是其大小可以动态改变是由容器自动处理的。3、vector插入一个数据,需要重新分配一个数组,并将所有元素移到这个数组。4、与其他容器相比,vector访问元素、末尾添加和删除元素效率更高效,不在末尾的添加和删除元素操作效率更低。二、vector的常用接口1、构造函数(1)vector():无参构造(2)vector(size_type原创 2020-08-06 09:44:24 · 315 阅读 · 0 评论 -
【STL-string】
一、STL简介1、什么是STL?STL是是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包括数据结构与算法的软件框架。2、STL的六大组件仿函数、算法、迭代器、空间配置器、容器、配接器。3、STL的缺陷(1)STL库更新太慢(2)STL没有支持线程安全,并发环境下需要自己加锁(3)追求效率导致内部结构复杂(类型萃取等)(4)STL会导致代码膨胀(本质是模板语法导致的)二、String类1、string类简介(1)string类是表示字符串序列的类(2)其接口原创 2020-08-03 15:18:33 · 166 阅读 · 0 评论 -
【string的模拟实现】
1、简单string类实现(深拷贝)namespace pz{ class string { public: //构造函数,无参和带参的 string() :_str(nullptr) {} string(char* str) :_str(new char[strlen(str) + 1])//在堆上多申请一个空间存\0 { strcpy(_str, str);//再将数据拷贝到代码段 } string(const string&s)//深拷原创 2020-08-03 11:05:46 · 182 阅读 · 0 评论 -
【模板】
1、泛型编程编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础2、模板分为函数模板和类模板(1)函数模板什么是函数模板?解:代表了一个函数族,该模板与类型无关,在使用时被参数化,根据**实参类型产生函数的特定类型版本。template<typename T>void Swap( T& left, T& right){T temp = left;left = right;right = temp;}注:template是定原创 2020-07-26 14:37:44 · 159 阅读 · 0 评论 -
【了解单例模式】
1、设计一个类,只能在堆上创建对象方法:构造函数私有化将构造函数私有化,拷贝构造也要私有化(若对堆上创建的对象进行解引用并调用拷贝构造,同样可以在栈上创建对像。)提供一个静态函数,静态函数完成堆上对象的创建。class Test{ Test() { cout << "Test()" << endl; } ~Test() { cout << "~Test()" << endl; } Test(const Test&);/原创 2020-07-26 08:32:15 · 147 阅读 · 0 评论 -
【C/C++内存管理】
1、c/c++内存划分图栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量2、C语言内存管理方式动态内存管理(1) 为什么要有动态内存管理?因为常规空间开辟的方式,开原创 2020-07-23 08:42:57 · 238 阅读 · 0 评论 -
【关于类的练习】
1、计算一个类创建了多少个对象#include<iostream>using namespace std;class temp{ static int a;public: temp() { ++a; } temp(const temp& b) { ++a; } static int GetA() { return a; }};int temp::a = 0;int main(){ cout << temp::GetA(原创 2020-07-21 15:24:28 · 243 阅读 · 0 评论 -
【c++类初始化列表、staic成员、内部类、友元】
一、构造函数整体赋值与初始化列表赋值1、整体赋值class Date{public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};上面的代码为整体赋值,调用构造函数后,对象会有一个初值。但是,其只能称为赋初值****而不是初始化,因为初始化只能有一次,而构造函数体内可以多次赋值。2、初始原创 2020-07-21 10:07:43 · 217 阅读 · 0 评论 -
【c++类的默认六个成员函数详解】
类的六个默认成员函数构造函数析构函数拷贝构造赋值运算符重载取地址运算符重载const修饰的取地址运算符重载为什么要有这些默认成员函数?如果一个类,在初始化之前就调用了打印函数,则会导致输出的是一个随机值,为了避免这种情况,所以c++给了六种默认成员函数。并且任何一个类在不写的情况下都会自动生成6个默认成员函数。一、构造函数1、什么是构造函数?它的作用?构造函数就是在创建类对象的时候,由编译器自动调用,为对象进行初始化的一个特殊成员函数。它的名称和类名相同,并且在对象的声明周期原创 2020-07-12 20:21:47 · 1644 阅读 · 3 评论 -
【日期类的实现c++】
代码:#include<iostream>using namespace std;//实现一个日期类class Date{public: int GetMonthDay(int year, int month) { int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month == 2 && ((year % 4 == 0 &&原创 2020-07-12 19:12:20 · 164 阅读 · 0 评论 -
【c++类定义、内存对齐、大小端、this指针】
C语言是面向过程的语言,而C++是面向对象的语言,那么类与对象到底是什么呢?1、什么是类?C++的类和结构体与C语言的结构体差不多,不过C语言结构体中只能定义变量,而C++的结构体和类内不仅可以定义变量,也可以定义函数。struct ListNode_C//c语言的结构体{ int _val; struct ListNode_c* _next; //只有加上struct才是一个类型 struct ListNode_c* _prev;};struct ListNode_CPP/.原创 2020-06-29 14:27:35 · 250 阅读 · 0 评论 -
【c++基础】(指针和引用、内联函数、auto、nullptr)
指针和引用的区别相同点:在语法概念上,引用是一个别名,没有独立开辟空间,和其引用的对象用同一块空间。在底层实现上实际是有空间的,因为引用是按照指针方式来实现的,即地址的赋值。不同点:引用在定义时必须初始化,指针没有要求引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体没有NULL引用,但有NULL指针在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)引用自加即引用的实体增加1,.原创 2020-06-28 22:13:48 · 449 阅读 · 0 评论 -
【c++基础】(命名空间、函数重载、缺省参数、引用)
一、命名空间1、什么是命名空间?命名空间也称名字空间、名称空间等,它表示一个标识符可见的范围,一个标识符可以在多个名字空间中定义,它在不同的名字空间中的含义是互不相干的。2、为什么要有命名空间?使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。名字空间污染:...原创 2020-06-28 20:47:45 · 271 阅读 · 0 评论 -
c++模板初阶
模板初识模板可以分为:函数模板和类模板。定义形式:temelate<模板参数表>模板定义体(1)temelate为声明模板的关键字;(2)模板的参数列表可以包括一个或多个模板参数,每个模板参数由关键字class/typename(表示任何内部类型或用户自定义类型)和模板形参组成,当模板参数多于一个时,用逗号隔开;(3)模板定义体是该模板的作用体,可以是函数或者是类...原创 2019-09-11 18:18:51 · 293 阅读 · 0 评论 -
c++中的【string】类
string类一、string类的简介(1)string是表示字符串的字符串类(2)该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。(3)string在底层实际是:basic_string模板类的别名,是以char对该类模板的实例化。(4)不能操作多字节或者变长字符的序列。(5)头文件 #include命名空间 namespace std二...原创 2019-09-21 20:11:13 · 149 阅读 · 0 评论