C++
文章平均质量分 84
C++学习
枫yy
靡不有初,鲜克有终。
展开
-
算法 —— 二分查找
这道题可以引出另外两个重要的二分查找模板:查找左边界的二分模板 查找右边界的二分模板以上是两个模板的内容,判断条件根据题目内容修改,以题目示例1为例,下面给出具体解释为什么这样做可行:public:// 处理为空// 找左端点else// 判断是否有结果// 找右端点 // left可以从左端点开始elseleft = mid;= -1)else。原创 2024-07-07 08:53:13 · 477 阅读 · 0 评论 -
C++入门 容器适配器 / stack && queue模拟实现
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组。我们假设一个buff是10个int大小的空间数组,map中存放了每个buff数组的地址,buff数组用来存放数据,可以理解他从中间开始利用空间,向左右扩容。原创 2024-07-05 19:05:46 · 1556 阅读 · 0 评论 -
C++入门 stack && queue 介绍及使用
1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作pop_back:尾部删除元素操作。原创 2024-07-05 16:29:07 · 707 阅读 · 0 评论 -
C++入门 list的模拟实现
要模拟实现list,必须要熟悉list的底层结构以及其接口的含义,通过之前学习,这些内容已基本掌握,现在我们来模拟实现list。参照带头双向循环链表的结构,我们可以建立以下三个类来模拟实现list。原创 2024-06-27 00:27:03 · 361 阅读 · 0 评论 -
C++入门 list的介绍及使用
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问。原创 2024-06-25 11:28:03 · 509 阅读 · 0 评论 -
C++入门 vector深度剖析及模拟实现
在上两篇有关vector的模拟实现中,还有构造,拷贝构造,赋值拷贝以及析构函数没有实现,本篇主要实现四个函数,并探讨memcpy拷贝问题原创 2024-06-23 11:17:31 · 1145 阅读 · 0 评论 -
C++入门 vector迭代器失效
erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T *。出错原因:以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释放掉, 而在打印时,原创 2024-06-23 09:04:30 · 577 阅读 · 0 评论 -
C++入门 vector部分模拟实现
这里成员变量的iterator可以理解为指针类型,但实际上并不是指针。具体框架就如上vector所示,这里不难发现,vector利用的是模板,意味着vector可以利用string等类型来搭建顺序表。原创 2024-06-22 18:03:03 · 330 阅读 · 0 评论 -
C++入门 vector介绍及使用
vector的文档介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素,也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小。为了增加存储空间,其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为。原创 2024-06-15 10:11:22 · 1292 阅读 · 0 评论 -
C++入门 深浅拷贝 & 拷贝赋值优化
浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共 享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。深拷贝:每个对象都有一份独立的资源,不要和其他对象共享。如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一般情况都是按照深拷贝方式提供。原创 2024-06-13 11:05:18 · 387 阅读 · 0 评论 -
C++入门 string的模拟实现
在string的库中有两个swap,标准库也有swap的实现,这些swap的区别是什么呢?那么 string为什么要实现一个类成员函数swap一个非成员函数swap呢?原创 2024-06-13 10:46:56 · 280 阅读 · 0 评论 -
C++入门 string常用接口(下)
在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般 情况下string类的+=操作用的比较多,注意,字符串转整型最多只能转42亿一下的(unsigne int)平常不建议使用string转整形。+=操作不仅可以连接单个字符,还可以连接字符串。按照ascii码比较即可,一位一位依次比较。从输入中提取整行字符,直到找到分隔符。或换行符 '\n'为止。原创 2024-06-11 19:32:58 · 420 阅读 · 0 评论 -
C++入门 string常用接口(中)
这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内 部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一 致,一般情况下基本都是用size()。resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。这三个相当简单,不过多赘述,注意的是size返回字符串有效字符长度。原创 2024-06-11 14:41:01 · 1380 阅读 · 0 评论 -
C++入门 string常用接口(上)
string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名,typedef basic_string string;不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include以及using namespace std;原创 2024-06-09 11:22:12 · 586 阅读 · 0 评论 -
C++入门 模板(初阶)
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供 调用。因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T, 编译器无法确定此处到底该将T确定为int 或者 double类型而报错。类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟< >,然后将实例化的类型放在< > 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。原创 2024-06-07 17:01:50 · 683 阅读 · 0 评论 -
C++入门 内存管理
目录C/C++内存分布程序内存实战测试 C语言中动态内存管理方式C++内存管理方式new/delete操作内置类型new和delete操作自定义类型自定义类型变量自定义类型数组operator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)malloc/free和new/delete的区别在正式开始记笔记前,先巩固一下基础:在C/C++程序内存划分如下图所示: globalVar、staticGlobalVar、staticVa原创 2024-06-06 11:09:02 · 705 阅读 · 0 评论 -
C++入门 友元 & 编译器优化
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。友元分为:友元函数和友元类。原创 2024-06-04 22:27:50 · 627 阅读 · 0 评论 -
C++入门 初始化列表 & 隐式类型转换
构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值 的构造函数,还具有类型转换的作用。即用explicit修饰构造函数,将会禁止构造函数的隐式转换。原创 2024-06-03 23:49:04 · 1626 阅读 · 0 评论 -
C++入门 类--赋值运算符重载(下)
此处用假设法,默认this是max,d是min,两者相减是正值(flag调整正负),如果假设错误,就改变,flag置为-1,然后min++知道min和max相等为止,n与min同时++,返回值就是n * flag。为了区分,构成重载,给后置++,强行增加了一个int形参。注意:前置++后的()不用给参数,后置++后的()需要给一个int,此处的int只是为了区分前置++和后置++,int可以为任意值,也可以不传值。因此不修改成员的都可以在函数后面加上const(只有++,+=,--,-=不能修改)原创 2024-06-02 18:52:02 · 784 阅读 · 0 评论 -
C++入门 类--赋值运算符重载(上)
出了作用域,返回对象还在没有析构,那就可以用引用返回,减少拷贝返回对象生命周期到了,会析构,传值返回返回对象生命周期没到,不会析构,传引用返回。原创 2024-06-01 14:12:58 · 608 阅读 · 0 评论 -
C++入门 类--拷贝构造函数
若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。简单来说,没有开辟空间,直接拷贝成员值的过程叫做浅拷贝,如Time / Date;构造函数开辟空间,拷贝时候需要拷贝相同大小的空间复制值的过程叫做深拷贝,如TreeNode / Stack如果没有管理资源,一般情况下不需要写拷贝构造,默认生成的拷贝构造即可,如Date如果都是自定义类型成员,内置类型成员没有指向资源,默认生成的拷贝构造即可,如MyQueue。原创 2024-05-30 15:57:17 · 437 阅读 · 0 评论 -
C++入门 类--构造函数 & 析构函数
一般情况下,构造函数需要我们自己显示的去实现。只有少数情况下可以让编译器自动生成构造函数,如MyQueue,成员全是自定义类型。有资源显示需要清理,就需要写析构函数,如Stack \ List没有资源需要清理,就不用显示写析构函数,如Time \ Date内置类型成员没有资源需要清理,剩下的都是自定义类型成员,就不用显示写析构函数,如MyQueue(两个栈实现队列)原创 2024-05-30 11:47:14 · 802 阅读 · 0 评论 -
C++入门 初识类
以下代码以栈为例1. 声明和定义全部放在类体中。public:// 成员函数//....private:// 成员变量//Stack.hpublic:// 成员函数private:// 成员变量//Stack.c//......推荐使用第二种定义方式。原创 2024-05-28 19:40:40 · 1060 阅读 · 0 评论 -
C++入门 引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。//原创 2024-05-27 16:50:58 · 635 阅读 · 0 评论 -
C++入门 内联函数
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。return 10;auto b = a;//输出10//输出a//输出10auto e;无法通过编译,使用auto定义变量时必须对其进行初始化return 0;注意:使用auto定义变量时必须对其进行初始化。原创 2024-05-26 14:50:23 · 748 阅读 · 0 评论 -
C++入门 缺省参数 & 函数重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。原创 2024-05-25 22:33:58 · 331 阅读 · 0 评论 -
C++入门 命名空间的使用
/ 命名空间中可以定义变量/函数/类型int val;ps:1.命名空间可以嵌套2.一个工程里可以存在相同名称的命名空间,最后会被合并成一个。原创 2024-05-23 14:46:43 · 250 阅读 · 1 评论 -
C++入门 输入 & 输出
在这之前,首先了解一下C++里输入输出和C语言输入输出有何不同。原创 2024-05-23 16:08:43 · 316 阅读 · 1 评论