C++学习
文章平均质量分 62
青山是哪个青山
这个作者很懒,什么都没留下…
展开
-
C++——list
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭。:list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致。4.与其他容器相比,在任意位置的插入、删除元素效率更高。erase后再访问就会变成随机值。3.不支持任意位置的随机访问。原创 2022-12-13 22:51:46 · 126 阅读 · 0 评论 -
迭代器失效的问题——基于vector
此时的resize引起了vector的扩容,那么原本的迭代器就会失效,因为it还是使用的扩容前的旧空间,打印的时候就是使用的就空间,导致运行的崩溃。此时迭代器是无效的,++it。一般而言erase不会导致失效,但是当pos的位置是最后一个元素时,删除了pos位置的元素,pos。可以看到当a.erase(it)的时候,迭代器又失效了,因为空间的变化导致it没有更新,所以无法完。此时把it++放在else的外面又会报错,因为it更新后的位置就是下一个元素的位置,所以不能把。前搬移了,it的位置还是有效的。原创 2022-12-12 21:32:22 · 351 阅读 · 0 评论 -
浅拷贝/深拷贝——基于string
浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。此时s1,s2都指向同一片保存数据的空间,那么当调用析构函数的时候,销毁s1的时候,该空间已经释放,s2的指针成为野指针,当调用析构函数的时候会报错。此时s2用string的拷贝构造来实现,如果没有显示实现,则使用系统默认的拷贝构造函数。原创 2022-12-11 21:46:01 · 138 阅读 · 0 评论 -
C++模板
一、泛型编程如图所示,每个类型都创建一个交换函数过于繁琐,是否可以创建一个通用的交换函数以及其他函数。函数重载虽然可以实现,但是仍然有缺陷:重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数;代码的可维护性比较低,一个出错可能所有的重载均出错。泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。模板:函数模板、类模板。二、函数模板函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。格式:原创 2022-12-04 20:47:23 · 59 阅读 · 0 评论 -
C++内存管理:new/delete
一、C/C++内存分布栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。二、C++内存管理C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。 申请和释放连续的空间,使用new[]和delete[],要注意匹配起来使用。new/delete与malloc/free最大的区别是申请自定义类型的空间的时候。原创 2022-12-03 18:34:23 · 93 阅读 · 0 评论 -
C++学习笔记5
特点:友元函数可访问类的私有和保护成员,但不是类的成员函数;友元关系不能传递,如果C是B的友元, B是A的友元,编译器默认的构造函数或者自己实现的构造函数,但是变量是随机值的,这不是初始化,而是赋初。友元函数:可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在。友元类:友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成。如果一个类定义在另一个类的内部,这个内部类就叫做内部类。,参见友元类的定义,内部类可以通过外部类的对象参数来访问。原创 2022-12-02 21:33:49 · 68 阅读 · 0 评论 -
C++学习笔记4
哪怕main没有生成Time的类,但是Date的类里面包含了Time的类型,那么在调用析构函数的时候。检测是否自己给自己赋值;如果是stack这样要申请内存资源的类,不写拷贝构造,那么在使用拷贝的时候,调用的系统的默。当默认构造是内置类型的时候,生成的是随机数。认拷贝构造,是浅拷贝,此时两个类对象指向的同一个内存空间,那么释放一个后,再释放另一个。用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义;赋值运算符只能重载成类的成员函数不能重载成全局函数,因为全局的会和类的默认生成的冲突,原创 2022-12-01 23:06:09 · 293 阅读 · 0 评论 -
C++学习笔记3
例如c语言中实现的栈,结构体只能定义变量,但是在c++的struct中可以直接定义函数,从而简化。类定义了一个新的作用域,类的所有成员都在类的作用域中。但是没有变量的时候类会。调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。当一个类实例化两个对象,那么这两个对象调用同一个函数的时候,函数是怎么区分是哪个对象。C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。为了区分成员变量与函数形参的区别,通常会对成员变量的名字进行修饰,例如添加_等。原创 2022-12-01 18:22:34 · 308 阅读 · 0 评论 -
C++学习笔记2
在C++11中,auto作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时。auto使用时的变量必须初始化,在编译时,编译器会用变量的实际类型来替换auto,auto只是暂时。以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调。内联在编译的时候会直接展开,可以减少栈帧调用开销,提高运行效率,但是如果调用次数过多,在同一行声明多个变量的时候,变量的类型必须保持一致,不然会编译失败。用建立栈的开销,内联函数提升程序运行的效率。原创 2022-12-01 16:53:05 · 326 阅读 · 0 评论 -
C++学习笔记1
函数重载指的是C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列。缺省参数又分为全缺省以及半缺省,半缺省必须从右往左给出,无法间隔,同时在函数的声明和定。传值返回会创建一个临时变量来存储值,但是传引用返回不会,能减少拷贝,提高效率,并且可以。在调用该函数时,如果没有指定实。因为存在大量的变量、函数以及类,为了避免命名冲突,对标识符的名称进行本地化。的名字,参数都一致,但是返回值不同,编译器仍然无法区分,不构成重载。引用必须初始化,引用可以有多个,一个引用只能引用一个实体,无法变更。原创 2022-11-30 23:52:39 · 88 阅读 · 0 评论