自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 操作系统概述

指令分为特权指令和非特权指令,特权指令运行于内核程序,非特权指令运行于应用程序,cpu为了区分执行哪种指令,cpu出现了两种状态, 内核态, 用户态。操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务,主要包括命令接口和程序接口,其中程序接口就是由一组系统调用组成,系统调用是指操作系统提供给应用程序的接口。不同的中断信号,需要不同的中断处理程序来处理,当cpu检测到中断信号后,会根据中断中断的信号类型查询,中断向量表。内核程序是操作系统的基础,它直接影响计算机系统的性能和稳定性。

2023-08-16 07:16:02 130

原创 C++unique_ptr小结

通常情况下, unique_ptr的大小和裸指针的大小一样, 但是当指定了删除器之后, unique_ptr的指针的大小会随之而改变,所以对于unique_ptr来说, 指定了删除器可能会导致效率下降。

2023-08-13 13:00:53 176

原创 C++ unique_ptr概述 常用操作

uniue_ptr是一个独占式的指针,同一个时刻, 就只能有一个unique_ptr指向这个对象(内存),unique_ptr的使用格式unique_ptr的常规初始化:创建一个空的智能指针make_unique函数make_unique函数是在C++14中引入的,使用了make_unique函数之后不能指定删除器, 如果不需要使用删除器, 尽量使用make_unique函数,他的效率高。

2023-08-13 11:34:46 214

原创 C++ shared_ptr使用场景和陷阱

在这里a_1和a_2分别引用计数, 没有关联, 会造成同一个对象被释放两次,使得程序崩溃.要这样做, 就必须要让两个对象关联起来, 所以介绍一种可行的方法.enable_shared_from_this(c++标准库里面的类模板)在这里a_1指向了A类对象, a_2指向了B类对象, 在他们内部的指针又互相指向对方,这样便造成了循环依赖, 在对象过期的时候, 这里的计数从2变成了1, 没有变成零, 所以导致内存泄漏.将一个裸指针指向的对象交给智能指针托管之后,避免裸指针后续的使用,否则会导致不可预料的结果。

2023-08-08 17:34:16 278

原创 C++智能指针weak_ptr

weak_ptr概述weak_ptr辅助shared_ptr进行工作,weak_ptr是弱引用的意思(强引用是shared_ptr), weak_ptr同shared_ptr一样都是类模板和智能指针,weak_ptr对资源的引用是非拥有式的,weak_ptr没有资源的管理权限,不能控制资源的释放,它常被用来检查资源.weak_ptr的创建弱引用常常用shared_ptr来初始化.

2023-08-06 11:41:28 121

原创 C++ 智能指针shared_ptr

在介绍智能指针前先看如下代码str = * ps;return;str = * ps;delete ps;return;

2023-08-06 08:47:11 172

原创 C++ 可变参数模板

参数包的展开:展开参数包,一般都采用递归函数, 所以在我们代码的编写过程中,需要有一个参数展开包的函数,和一个同名的递归终止函数, 可以通过这两个函数将参数包展开。一般对于可变参函数模板,都写一个参数,和一包参数,这样方便参数包的展开。对于可变参数模板我们一般把a称作一包,或者一堆参数,并且这些参数可以完全不同,对于T不能把它看作为具体的类型,要理解为0到多个不同的类型,那么a就是多个不同的参数。可变参数模板:允许模板中有0个到任意个模板参数,在语法上和传统模板不一样,多了一个...

2023-08-02 17:50:35 325

原创 C++ 模板全特化, 偏特化(局部特化)

对于模板的特化, 需要先有泛化的版本才可以,下面是一些例子在有泛化的版本Print之下, 才能出现特化的版本,常规全特化是指,所有模板的参数都要用具体的类型代表。

2023-08-02 15:38:02 190

原创 c++ using定义类型别名

using在用于定义类型, (定义类型模板)的时候, 包含了typedef的所有用法, 下面来看一些使用using定义类型别名的例子。在using中使用这种模板,既不是类模板, 也不是函数模板, 我们可以看成一种新的模板类型, 类型模板(别名)在未引入using之前定义类型的别名通常用typedef, 下面是一些typedef定义类型别名的用法。如何在map中保持前面部分不变, 后面是用户自定义的类型呢?1, 定义一个自定义函数参数类型和返回类型的函数指针模板。以下是一些使用using定义类型别名的练习。

2023-08-02 12:00:32 219

原创 c++ 显示实例化

现在将模板类A封装到头文件test.h中// test.h 头文件class Apublic:现在创建了test_1, test_2的cpp文件在这两个cpp文件中都有使用模板A, 当编译器遇见这些语句都会实例化一个A<float>, 如果当文件中定义了很多这种代码. 这会造成生成多个实例化的开销.为了避免这种开销,可以使用显示实例化.在test_1顶部包含这条语句// 显示实例化中的实例化定义, 这种实例化定义只需要在一个cpp文件中写就行。

2023-08-02 09:07:11 157

原创 C++ 依赖类型 函数指针

依赖类型是指在模板编程中,类型依赖于模板参数的一种特殊类型, 它是通过使用模板参数来定义的, 而不是显示地指定类型。由于模板参数可以是任何类型,编译器在实例化模板时无法确定依赖类型的具体定义和属性。当使用依赖类型的时候需要使用typename关键字来告诉编译器该名称是一个类型。这是因为编译器默认将依赖名称解析为一个静态成员或静态成员函数。而不是一个类型。

2023-08-02 07:36:05 120

原创 C++ 可调用对象与function模板

可调用对象是指可以像函数一样被调用的实体,C++中常见的可调用对象如下1,函数指针2,函数对象, 函数对象是一个类对象,它重载了函数调用运算符operator(), 使得对象可以像函数一样被调用。

2023-08-01 19:12:47 186

原创 C++ 模板

以两个数的加法为例子T temp;函数模板在调用的时候, 编译器会根据你传入的实际类型推断模板参数类型, 这个过程是在编译期间完成的.当编译器无法推断出实际类型, 需要我们手动的传入类型.当使用具体类型传入参数的时候, 函数模板会生成这个类型特定的函数int temp;template<typename 形参名1, typename 形参名2>class ....在类模板里面, 成员函数要以template<typaname T>开头,下面是示例private:T x;

2023-08-01 11:55:00 151

原创 第十八章 探讨C++新标准

对象移动是将资源的所有权从一个对象转移到另外的一个对象, 而不是进行深拷贝, 来避免不必要的数据复制和内存分配.

2023-08-01 01:13:48 181

原创 C++ 临时对象探讨, 性能提高手段

临时对象: 临时对象是指在表达式中创建并在表达式结束后立即销毁的对象.

2023-07-31 16:11:39 271

原创 左值 右值 std::move函数

左值是一个内存块的表达,,代表一个地址,可以被取地址,赋值, 常常出现在赋值语句的左边.变量, 数组元素, 结构成员, 引用, 和解除引用都是左值.

2023-07-31 12:03:50 163

原创 第十五章 友元 异常和其他

RTTI是运行阶段类型识别,通过运行时类型识别,程序能够使用基类的指针或者引用来检查这些指针或者引用所指向的对象的实际派生类型。

2023-07-30 13:40:49 133

原创 第十三章 类继承3

抽象基类是一种特殊的类, 他不能被实例化, 只能被用作其他类的基类, 抽象基类必须包含一个或以上的纯虚函数, 这些函数没有实现(可以被定义), 需要在派生类中进行实现.

2023-07-29 19:59:19 329

原创 第十六章 string类和标准模板库

其中container_type是容器名字, iterator是容器提供的迭代器类型, iterator_name是迭代器对象的名称.如定义一个vector容器的迭代器对象。

2023-07-29 16:46:02 283

原创 第十三章 类继承2

友元函数不能为虚函数, 因为友元函数不是类成员,而只有类成员才能是虚函数如果派生类函数没有重新定义函数, 则派生类将使用原来函数的基类版本.class Apublic:public:B b;

2023-07-24 20:28:27 68

原创 第十三章 类继承1

概念:成员初始化列表是一种在类的构造函数中初始化成员变量的方法。它使用初始化列表来为成员变量赋初值,而不是在构造函数的函数体中进行赋值操作。成员初始化列表快的原因:避免了默认构造函数的调用:如果在构造函数的函数体中对成员变量进行赋值,那么在对象创建时会先调用默认构造函数来初始化成员变量,然后再进行赋值操作。而使用成员初始化列表,可以直接在对象创建时为成员变量赋初值,避免了默认构造函数的调用,从而提高了效率。直接初始化:成员初始化列表允许我们使用直接初始化语法来初始化成员变量。

2023-07-24 14:38:36 38

原创 第十二章 类和动态内存分配

需要注意的是,使用new分配的内存可以直接赋值给相应类型的指针,而malloc返回的void指针需要进行类型转换后才能使用。对于重载>>必须返回对象的引用,如果只是返回对象,那么ostream就会调用复制构造函数,但是ostream没有公有的复制构造函数。深拷贝:将一个对象的值复制给另外的一个对象(复制指向的数据),这样一来两个对象是独立的,对一个对象的修改不会影响另外的一个对象。语法:new和delete是C++中的操作符,可以直接使用,而malloc和free是C语言中的函数,需要通过调用来使用。

2023-07-23 12:52:34 33

原创 第十一章 使用类

5,赋值运算符,下标运算符,函数运算符,等运算符只能通过成员函数重载。4,不能重载sizeof,成员运算符,作用域运算符等特定的运算符。1,重载后的运算符至少必须有一个操作数是用户定义的类型。2,在使用运算符时不能违反运算符原来的句法规则。使用方法:operator+()重载+运算符;使用构造函数能够将类类型和数据类型进行转换。explicit可以关闭隐式类型转换。定义方式:在类声明时用friend;访问权限与成员函数访问权限相同。3,不能创建新的运算符。

2023-07-21 14:19:43 41

原创 第十章 对象和类

静态成员函数不属于任何具体的对象,它属于整个类,所以在静态成员函数里面,不会存在this指针,当然也不可能操作this指针。成员函数则不是,因此成员变量需要存储到对象中,而成员函数则不需要。这就是为什么静态成员函数不能访问非静态成员变量的原因。class与struct的主要区别在于默认的访问权限与继承方式,class中默认访问权限是private,struct中是public.继承方面class默认私有继承,struct公有继承。this指针不属于类的成员,只是成员函数的参数,所以不占用大小。

2023-07-17 19:43:37 53

原创 C++ 临时对象的生成与构造函数

在学习到C++ peimer plus第十章构造函数小节时,对于临时对象的生成出现一些疑问,现在暂时记录出现的问题,能以后深入学习了看是否能够解决。第二种语法:允许调用构造函数创建一个临时的对象,通过临时对象来把内容复制到stock2中。像这种在赋值语句中使用构造函数给已经存在的对象赋值的时候会创建临时对象。第一种语法:这种情况与第一种方式一模一样,不会创建临时的对象。对于这种隐式的调用构造函数的情况不会生成临时对象。第一种:按值传递参数会生成临时对象。第三种:函数返回一个对象的时候。

2023-07-17 16:19:59 127

原创 C++ 期末作业 通讯录

【代码】C++ 期末作业 通讯录。

2023-07-16 21:24:40 44

原创 第八章 函数探幽 默认参数与函数重载

注意:对于单一的重载,当类型不匹配时会进行类型的转换,从而匹配相应的函数,当有多种选择的时候,编译器将会拒绝选择,并将其视为错误。第一个函数的参数与可修改的左值参数匹配,第二个函数与可修改的左值,cosnt左值参数,和右值参数进行匹配,第三个函数与左值匹配。重载这三个函数结果将如何呢?注意:对于带参数列表的函数,必须从右到左添加默认值。实参按重左到右的的顺序依次被赋给相应的形参,不能跳过任何一个参数。函数重载:函数重载是指在同一个作用域内,可以定义多个同名的函数,但这些函数的参数列表必须不同。

2023-07-14 12:44:02 37

原创 第八章 函数探幽 内联函数与引用2

3,为何将const用于返回类型:请注意accumulate(dup, five) = four这条语句,在赋值语句中左边必须是可以修改的左值,也就是说左边必须是一个可以修改的内存快,另一方面,常规(非引用)返回类型是右值——不能通过地址访问的值,这种表达式可以出现在赋值语句的右边,单不能出现在左边,其他右值包括字面值,表达式。因为函数的返回值是一个引用,会成为一个左值,所以能够赋值。在返回引用的时候,不要让其指向一个临时的变量的引用,在函数运行完毕后,临时变量将会被销毁。8.2.6 对象,继承,和引用。

2023-07-14 11:13:05 31

原创 第八章 函数探幽 内联函数与引用1

注意:如果函数调用的参数不是左值或与相应的 const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量。引用变量的定义:C++中的引用变量是一种别名。内联函数的定义:C++内联函数是一种在编译时将函数调用替换为函数体的优化技术,它可以减少函数调用的开销。内联函数的使用方法:在函数声明前加上inline,在函数定义前加上inline,(在类中实现的方法将成为内联函数)。生成临时变量的两种情况:实参的类型正确,但不是左值,实参的类型不正确,但可以转换为正确的类型。

2023-07-14 08:27:41 39

原创 LeetCode 215. 数组中的第K个最大元素

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。输入: [3,2,3,1,2,4,5,5,6], k = 4。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。输入: [3,2,1,5,6,4], k = 2。

2023-04-01 22:13:00 40

原创 LeetCode 645.错误的集合

集合 s 包含从 1 到n的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组 nums 代表了集合 S 发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。示例 1:输入:nums = [1,2,2,4]输出:[2,3]示例 2:输入:nums = [1,1]输出:[1,2]class Solution {public:

2023-03-09 15:42:33 43

原创 LeetCode 485. 最大连续 1 的个数

给定一个二进制数组 nums , 计算其中最大连续 1 的个数。示例 1:输入:nums = [1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.示例 2:输入:nums = [1,0,1,1,0,1]输出:2提示:1 <= nums.length <= 105nums[i]不是0就是1.class Solution {public: int findMaxConsecuti

2023-03-05 09:37:34 55

原创 LeetCode 两数之和

给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], ta

2023-03-04 20:04:57 40

原创 PAT 1028 人口普查

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。输入格式:输入在第一行给出正整数N,取值在(0,105];随后N行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按yyyy/mm/dd(即年/月/日)格式给出的生日。题目保证最年

2023-02-26 22:18:51 42

原创 PAT 1064 朋友数

如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。输入格式:输入第一行给出正整数 N。随后一行给出 N 个正整数,数字间以空格分隔。题目保证所有数字小于104。输出格式:首先第一行输出给定数字中不同的朋友证号的个数;随后一行按递增顺序输出这些朋友证号,数字间隔一个空格,且行末不得有多余空格

2023-02-26 13:04:33 46

原创 PAT 1059 C语言竞赛

C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。 1、排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶! 2、其他人将得到巧克力。给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。输入格式:输入第一行给出一个正整数N(≤104),是参赛者人数。随后N行给出最终排名,每行按排名顺序给出一位参赛者的 ID(4 位数字组成)。接下来给出

2023-02-26 10:30:13 49

原创 PAT 1071 小赌怡情

常言道“小赌怡情”。这是一个很简单的小游戏:首先由计算机给出第一个整数;然后玩家下注赌第二个整数将会比第一个数大还是小;玩家下注 t 个筹码后,计算机给出第二个数。若玩家猜对了,则系统奖励玩家 t 个筹码;否则扣除玩家 t 个筹码。注意:玩家下注的筹码数不能超过自己帐户上拥有的筹码数。当玩家输光了全部筹码后,游戏就结束。输入格式:输入在第一行给出 2 个正整数 T 和 K(≤100),分别是系统在初始状态下赠送给玩家的筹码数、以及需要处理的游戏次数。随后 K 行,每行对应一次游戏,顺序给出 4

2023-02-26 09:46:42 51

原创 PAT 1082 射击比赛

本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军;谁差得最远,谁就是菜鸟。本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟。我们假设靶心在原点(0,0)。输入格式:输入在第一行中给出一个正整数 N(≤10 000)。随后 N 行,每行按下列格式给出:ID x y其中ID是运动员的编号(由 4 位数字组成);x和y是其打出的弹洞的平面坐标(x,y),均为整数,且 0≤|x|, |y|≤100。题目保证每个运动员的编号不重复,且每人

2023-02-24 22:36:59 44

原创 PAT 1083 是否存在相等的差

给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面,洗牌,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值,其中是否存在相等的差?输入格式:输入第一行给出一个正整数 N(2≤N≤10 000),随后一行给出 1 到 N 的一个洗牌后的排列,第 i 个数表示正面写了 i 的那张卡片背面的数字。输出格式:按照“差值 重复次数”的格式从大到小输出重复的差值及其重复的次数,每行输出一个结果。输入样例:83 5 8 6 2 1

2023-02-24 22:36:41 39

原创 PAT 1078 字符串压缩与解压

文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如ccccc就用5c来表示。如果字符没有重复,就原样输出。例如aba压缩后仍然是aba。解压方法就是反过来,把形如5c这样的表示恢复为ccccc。本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。输入格式:输入第一行给出一个字符,如果是C就表示下面的字符串需要被压缩;如果

2023-02-24 20:18:37 48

空空如也

空空如也

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

TA关注的人

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