自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 容器适配器

stack、queue、priority_queue都是可以放元素,可以将其统称为容器,STL将其称为容器适配器。1.什么是适配器适配器是一种设计模式(设计模式是一套被反复使用的,多数人知晓的,经过分类编目的,代码设计经验的总结),该种模式是将一个类的接口转换成顾客希望的另外一个接口2.STL标准库中stack和queue的底层结构虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,

2021-05-07 23:44:07 379

原创 LeetCodeOJ题---数组中第k个大的元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。class Solution{public: int findKthLargest(vector<int>& nums, int k){ //方法一: //sort(nums.begin(), nums.end(), greater<int>()); //return nums[k - 1]; //方法二:用优先级队列来进行处理

2021-05-07 12:46:37 395

原创 模拟实现priority_queue

#include <iostream>using namespace std;#include <queue>#include <functional>void Testpriority_queue1(){ priority_queue<int>p; p.push(5); p.push(4); p.push(6); p.push(1); p.push(2); p.push(3); cout << p.top() &

2021-05-07 09:33:57 363

原创 priority_queue

priority_queue的介绍和使用priority_queue的介绍1.优先级队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2.此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)3.有限队列被实现为容器适配器,容器适配器即特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器“尾部”弹出,其称为优先队列的顶部。4.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器

2021-05-07 09:12:06 289

原创 queue

queue的介绍和使用queue的介绍1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提前元素。2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队,从队头出队。3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:

2021-05-06 17:03:20 305

原创 stack

stack的介绍1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3.stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:...

2021-05-06 17:02:59 455

原创 list

list的介绍1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针向其前一个元素和后一个元素3.list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效4.与其他的序列式容器相比(array, vector, deque),list通常在任意位置进行插入,移除元素的执行效率更好5.与其他序列式容

2021-05-06 15:38:25 282

原创 vector

string:专门用来管理字符串,底层结构是动态类型的 顺序表,存放char类型元素vector的底层结构也是动态类型的顺序表,任何元素都可以存放

2021-05-06 14:30:13 322

原创 深/浅拷贝

浅拷贝: 也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共同享有一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源以及被释放,以为还有效,所以当继续对资源进行操作时,就会发生访问违规,要解决浅拷贝问题C++中就引入了深拷贝。深拷贝: 如果一个类中涉及到资源的管理,其拷贝构造函数,赋值运算符重载以及析构函数必须要显式给出。一般情况都是按照深拷贝方式提供。写时候拷贝: 写时拷贝就是在浅拷贝的基础之上增加了引用计数的方式来实现的。引用计数: 用来

2021-05-06 00:18:17 275

原创 string类

string类:一种动态类型的顺序表—存储字符类型的元素,在一段连续的空间中string类中的接口分为以下几个模块构造与析构string();string(const char*);string(size_t n, char ch);string(const string& s);遍历操作容量相关size()capacity()empty()resize(size_t n, char ch);reserve(size_t n);元素访问相关operator[] (ind

2021-05-05 23:39:52 300

原创 STL简介

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。里面的代码时按照模板来实现的通俗的说:就是对常见数据结构的封装(顺序表,链表,栈和队列,二叉树,哈希等)还提供一些通用类型的算法,而这些算法都非常灵活。STL的版本1.原始版本2.P.J.版本3.RW版本4.SGI版本STL六大组件1.仿函数2.算法3.迭代器4.空间配置器5.容器6.配接器...

2021-05-05 21:36:37 273

原创 模拟实现Queue

#pragma once#include <list>namespace bite{ template<class T> class queue { public: queue() { } void push(const T& data) { _con.push_back(data); } void pop() { if (_con.empty()) return; _con.pop_front()

2021-05-05 15:10:49 300

原创 模拟实现Stack

#pragma once#include <vector>//问题:stack为什么没有迭代器?//不需要对stack中的数据进行遍历---只能在其一端进行操作namespace bite{ template<class T> class stack { public: stack() { } void push(const T& data) { Con.push_back(data); } void pop() {

2021-05-05 14:04:18 356

原创 模拟实现List

#pragma oncenamespace bite{ template<class T> struct ListNode { ListNode(const T& x = T()) : prev(nullptr) , next(nullptr) , data(x) {} ListNode<T>* prev; ListNode<T>* next; T data; }; template<class T>

2021-05-05 14:02:16 312

原创 模拟实现Vector

#pragma once#include <assert.h>namespace bite{ template <class T> class vector { public: typedef T* iterator; public: vector() : start(nullptr) , finish(nullptr) , end_of_stroage(nullptr) { } vector(int n, const T&a

2021-05-05 14:00:45 281

原创 LeetCodeOJ题---最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。class MinStack{public: MinStack(){ } void push(int x){ dataS.push(x); if (minS.empty() || x <= minS.top()) { minS.p

2021-05-05 13:57:13 293

原创 牛客OJ题---栈的弹出压入序列

class Solution{public: bool IsPopOrder(vector<int> pushV, vector<int> popV){ if (pushV.size() != popV.size()) return false; stack<int> s; size_t inIdx = 0, outIdx = 0; while (outIdx < popV.size()) { while (s.empty() |

2021-05-05 13:51:13 302

原创 LeetCodeOJ题---后缀表达式/逆波兰表达式

class Solution{public: int evalRPN(vector<string>& tokens){ stack<int> s; for (auto e : tokens) { } if (!("+" == e || "-" == e || "*" == e || "/" == e)) { //e是一个数字,入栈 s.push(atoi(e.c_str())); } else { //e是一个操作符

2021-05-05 13:25:33 323

原创 面试—C++深拷贝的两种实现方式

#include <iostream>using namespace std;//传统版class String{public: String(const char* str = "") { if(nullptr == str) str = ""; _str = new char[strlen(str) + 1]; strcpy(_str, str); //if (nullptr == str) //{ // _str = new char[1];

2021-03-20 09:55:08 1375

原创 C++之模板

面试官:写一个通用类型的加法函数int Add(int left, int right){ return left + right;}double Add(double left, double right){ return left + right;}char Add(char left, char right){ return left + right;}缺陷:1.代码的复用性较低2.不太好维护3.并不能够将所有类型重载出来—顶多时将内置类型重载完成,自定义类型没办法

2021-03-17 15:16:19 607

原创 C++动态内存管理(补充)

C++既然可以兼容C语言,即C语言中动态内存管理的方式在C++中仍旧可以使用,为什么C++要单独做一套动态内存管理的方式?**答:**在C++中,使用malloc/free在堆上申请或者释放内置类型的空间,没有任何问题,但是不能采用malloc从堆上申请对象的空间–>因为:malloc不会主动调用构造函数,因此该块空间并不能成为对象,而只是与对象大小相同的一块堆空间。也不能使用free释放堆对象的空间,因为free在释放对象空间时,不会调用析构函数将对象中的资源清理干净C++中动态内存管理方式:

2021-03-16 16:43:27 562

原创 回顾C语言中动态内存管理方式

malloc/calloc/realloc这三个方法之间的区别相同点a.都是C语言中用来进行动态内存申请的库函数b.申请的空间都在堆上,用完之后必须要使用free来进行释放c.如果空间申请成功,返回空间的首地址,如果申请失败返回的是NULL,因此在使用之前必须要进行判空d.返回值类型都是void*,在接收返回值时必须要进行强转不同点1.void* malloc(size_t size)malloc的参数时用户所申请空间的字节数,申请空间成功返回空间的首地址,如果申请空间失败,返回的是空,用户

2021-03-15 12:10:23 580

原创 C++动态内存管理

内核空间:放的是与操作系统相关的代码,用户没有权限直接去操作,如果要操作,只能通过api函数进行栈: 存放与函数调用相关的一些数据栈帧:函数的参数、函数体中的局部变量、一些寄存器信息特性:函数调用完成之后,对于的栈帧就被回收了有默认的大小(linux下默认8M)**内存映射段:**放置静态库动态库的数据等堆: 用户进行动态内存申请C语言中:malloc/calloc/realloc这些空间用完之后,必须要通过free来进行释放堆空间相对而言比较大**数据段:**全局数据(变量和对象),.

2021-03-15 10:08:35 572

原创 面试-static关键字

在C语言中:static可以修饰变量和函数修饰函数:改变该函数的连接属性,表明该函数只能在当前文件中使用修饰变量:全局变量:表明该变量只能在当前文件中使用函数体中的局部变量:1.延长该变量的生命周期(和成员函数的生命周期一样)2.类似该变量具有记忆的功能3.存放位置不同于函数体中的局部变量在C++中因为c++要兼容c语言,所以在修饰函数和变量时同C语言。除此之外C++中static还可以修饰类成员:成员变量和成员函数—>静态成员...

2021-03-15 09:39:00 605

原创 centos忘记密码怎么办?教你如何巧妙解决~

假设我们的root密码忘记了,请问如何找回密码?思路:进入到单用户模式(1),然后修改root密码,因为进入单用户模式,root不需要密码就可以登录。步骤:1.开机->在引导时立马按(321之前) 回车键2.看到一个界面输入e(开启前编辑)3.看到一个新的界面,选中第二行(编辑内核)再输入e->在这行最后输入空格1 再按回车键->再次输入b,这时就会进入到单用户模式4.直接修改密码指令:passwd root5.重启:reboot...

2021-03-02 00:06:02 1674

原创 再谈构造函数

构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; }private: int _year; int _month; int _day;};虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体

2021-02-28 20:08:44 812

原创 const成员

const修饰类的成员函数将const修饰的类成员函数称之为const成员函数, const修饰类成员函数,实质修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。我们来看看下面的代码class Date{public: void Display() { cout << "Display()" << endl; cout << "year:" << _year << endl; cout &l

2021-02-28 10:59:16 634

原创 日期类的实现

class Date{public: //获取某年某月的天数 int GetMonthDay(int year, int month) { static int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int day = days[month]; if(month == 2 &&((year % 4 == 0 && year % 100 != 0) || (ye

2021-02-28 10:42:54 648

原创 赋值运算符重载

运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型operator操作符(参数列表)注意:1.不能通过连接其他符号来创建新的操作符:比如operator@2.重载操作符必须有一个类类型或者枚举类型的操作数3.用于内置类型的操作符,其含义不能改变,例如:内置类型+,不能改变其含义4.作为类成员的

2021-02-28 10:25:13 799

原创 拷贝构造函数

拷贝构造函数概念在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。那在创建对象时,可否创建一个与该对象一样的新对象呢?拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。特征拷贝构造函数也是特殊的成员函数,其特征如下:1.拷贝构造函数是构造函数的一个重载形式。2.拷贝构造函数参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。class Date{public: Date(int

2021-02-28 00:15:46 685

原创 析构函数

析构函数概念前面通过构造函数的学习,我们知道一个对象是怎么来的,那一个对象又是怎么没的呢?析构函数:与构造函数功能相反,析构哈桑农户不是完成对象的销毁,局部对象下回工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。特性析构函数是特殊的成员函数。其特征如下:1.析构函数名是在类名前加上字符~。2.无参数无返回值3.一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。4.对象生命周期结束时,C++编译系统自动调用析构函数typedef i

2021-02-27 23:34:09 788

原创 构造函数

类的6个默认成员函数如果一个类中声明成员都没有,简称为空类,空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成6个默认的成员函数。构造函数概念对于以下的日期类class Date{public: void SetDate(int year, int month, int day) { _year = year; _month = month; _day = day; } void Display() { cout << _year

2021-02-27 21:53:54 651

原创 this指针

this指针this指针的引出我们先来定义一个日期类Dateclass Date{public: void Display() { cout << _year << "-" << _month << "-" << _day << endl; } void SetDate(int year, int month ,int day) { _year = year; _month = month; _da

2021-02-25 22:20:44 634

原创 类对象模型&&结构体内存对齐规则

类对象模型如何计算类对象的大小class A{public: void PrintA { cout << _a << endl; }private: char _a;};问题:类中既可以有成员变量,也可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?类对象的存储方式猜测对象中包含类的各个成员缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次

2021-02-25 22:00:09 686

原创 类的作用域&&类的实例化

类的作用域**类定义了一个新的作用域,**类的所有成员在类的作用域中。在类体外定义成员,需要使用::作用域解析符指明成员属于哪个类域class Person{public: void PrintPersonInfo();private: char _name[20] ; char _gender[3]; int _age;};//这里需要指定PrintPersonInfo是属于Person这个类域void Person::PrintPersonInfo(){ cout <

2021-02-25 19:27:39 693

原创 类的访问限定符及封装

类的访问限定符及封装访问限定符C++实现封装的方式:用类将对象的属性和方法结合在一快,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。【访问限定符说明】1.public修饰的成员在类外可以直接被访问2.protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止4.class默认访问权限为private,struct为public(因为strcut

2021-02-25 19:21:51 963

原创 类与对象

面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数struct Student{ void SetStudentInfo(const char* name, const char* gender, int age) { strcpy(_name, nam

2021-02-25 18:50:20 1206

原创 CPP11新特性——指针空值nullptr

C++98中的指针空值在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本就是按照如下方式对其进行初始化:void TestPtr(){ int* p1 = NULL; int* p2 = 0; // ......}NULL实际是一个宏,在传统的C头文件(stdef.h)中,可以看到如下代码:#ifdef NULL#ifdef __cplusplus#define NULL

2021-02-24 16:46:26 977

原创 CPP11新特性——基于范围的for循环

范围for的语法在C++98中如果要遍历一个数组,可以按照以下方式进行void TestFor(){ int array[] = { 1, 2, 3, 4, 5 }; for(int i = 0, i < sizeof(array) / sizeof(array[0]); ++i) array[i] += 2; for(int* p = 0, p < array + sizeof(array) / sizeof(array[0]); ++p) cout << *

2021-02-24 10:16:16 1413

原创 CPP11新特性——auto关键字

auto简介在早期C/C++中auto的含义是:使用auto 修饰的变量,是具有自动存储器的局部变量 ,但遗憾的是一直没有人去使用它。C++11中,标准委员会赋予了auto全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。int TestAuto(){ return 10;}int main(){ int a = 10; auto b = a; auto c = 'a'; auto d = Test

2021-02-24 10:00:25 1793

空空如也

空空如也

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

TA关注的人

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