c++
文章平均质量分 85
flyyyya
这个作者很懒,什么都没留下…
展开
-
C++的类型转换
由于编译器认为const修饰的变量是不会被修改的,因此会将const修饰的变量存放到寄存器当中,当需要读取const变量时就会直接从寄存器中进行读取,而我们修改的实际上是内存中的a的值,因此最终打印出a的值是未修改之前的值。上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针。如果父类的指针(或引用)指向的是一个子类对象,那么将其转换为子类的指针(或引用)则是安全的。原创 2024-03-16 20:30:17 · 1212 阅读 · 0 评论 -
C/C++内存管理详解
class Testpublic:Test() //构造函数:_a(0)cout << "构造函数" << endl;~Test() //析构函数cout << "析构函数" << endl;一、动态申请单个类的空间//申请delete p1;//销毁//申请free(p2);//销毁二、动态申请多个类的空间//申请//销毁//申请free(p4);//销毁。原创 2024-02-24 22:34:55 · 1160 阅读 · 0 评论 -
C++模板进阶操作 —— 非类型模板参数、模板的特化
优点:1.模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2.增强了代码的灵活性。缺陷:1.模板会导致代码膨胀问题,也会导致编译时间变长。2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2024-02-17 22:40:43 · 1062 阅读 · 0 评论 -
C++模板详解 —— 函数模板与类模板
class 类模板名//类内成员声明public:cout << "数学:" << _Math << endl;cout << "语文:" << _Chinese << endl;cout << "英语:" << _English << endl;T _Chinese;T _English;注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。T _Chinese;T _English。原创 2024-02-17 22:13:09 · 953 阅读 · 0 评论 -
C++11---lambda表达式
说明一下: 实际当我们以[&]或[=]的方式捕获变量时,编译器也不一定会把父作用域中所有的变量捕获进来,编译器可能只会对lambda表达式中用到的变量进行捕获,没有必要把用不到的变量也捕获进来,这个主要看编译器的具体实现。因此每个lambda表达式的类型都是不同的,这也就是lambda表达式之间不能相互赋值的原因,我们可以通过typeid(变量名).name()的方式来获取lambda表达式的类型。实际编译器在底层对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的。原创 2024-02-17 21:41:19 · 596 阅读 · 0 评论 -
C++11 ——— 右值引用和移动语义
左值是一个表示数据的表达式,如变量名或解引用的指针。左值可以被取地址,也可以被修改(const修饰的左值除外)。左值可以出现在赋值符号的左边,也可以出现在赋值符号的右边。原创 2024-02-08 23:23:39 · 753 阅读 · 0 评论 -
C++11智能指针
而如果连接结点时只进行一个连接操作,那么当node1和node2的生命周期结束时,就会有一个资源对应的引用计数被减为0,此时这个资源就会被释放,这个释放后另一个资源的引用计数也会被减为0,最终两个资源就都被释放了,这就是为什么只进行一个连接操作时这两个结点就都能够正确释放的原因。其次,shared_ptr中的引用计数count也不能定义成一个静态的成员变量,因为静态成员变量是所有类型对象共享的,这会导致管理相同资源的对象和管理不同资源的对象用到的都是同一个引用计数。原创 2024-02-06 10:59:00 · 949 阅读 · 0 评论 -
【C++项目】高并发内存池
当前项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。原创 2024-01-25 15:55:29 · 1145 阅读 · 3 评论 -
【STL】位图的介绍使用以及代码的模拟实现
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。1.构造一个16位的位图,所有位都初始化为0。构造一个16位的位图,根据所给值初始化位图的前n位。3.构造一个16位的位图,根据字符串中的0/1序列初始化位图的前n位。成员函数的介绍成员函数功能set设置指定位为1reset清空指定位flip反转指原创 2022-07-13 10:08:58 · 366 阅读 · 3 评论 -
哈希表,哈希桶的实现
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( ),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。、向该结构当中:插入元素: 根据待插入元素的关键码,用此函数计算出原创 2022-07-09 10:31:01 · 1073 阅读 · 4 评论 -
【STL】unordered_set和unordered_map
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同.1.构造一个空容器2.拷贝构造一个空间3.使用迭代器构造一段区间的内容unordered_map的函数接口说明成员函数功能in原创 2022-07-07 10:57:24 · 410 阅读 · 4 评论 -
【STL】map和set的使用
我们之前学习的vector list是序列式容器因为其底层为线性序列的数据结构,里面存储的是元素本身。原创 2022-07-04 12:03:28 · 417 阅读 · 7 评论 -
C++多态的理解
多态的理解概念虚函数三级目录概念多态:就是多种形态。静态的多态 — 函数重载动态的多态 — 父类指针或引用调用虚函数1.父类指针或引用指向父类,调用的就是父类的虚函数2.父类指针或引用指向哪个子类,调用的就是子类的虚函数。虚函数虚函数:成员函数前面加virtual称为虚函数注意的问题:1.只有类的非静态成员函数可以是虚函数2.虚函数这里virtual和虚继承中用的virtual是同一个关键字,但是他们之间没有关系。三级目录...原创 2021-11-03 20:32:49 · 1012 阅读 · 1 评论 -
C++之继承
c++之继承一、继承的概念及定义1.概念:2.定义3.继承关系和访问限定符4.继承基类成员访问方式的变化二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数问题五、继承和友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承一、继承的概念及定义1.概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以原创 2021-10-10 22:01:33 · 381 阅读 · 5 评论 -
STL之priority_queue的介绍和模拟实现
priority_queue的介绍和模拟实现一、priority_queue的介绍二、priority_queue的使用三、priority_queue的定义四、priority_queue的模拟实现一、priority_queue的介绍优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,que原创 2021-10-08 17:22:37 · 183 阅读 · 4 评论 -
STL之Stack和Queue的认识及模拟实现
STL之Stack和Queue的认识及模拟实现stack的认识stack的模拟实现queue的介绍queue的模拟实现stack的认识1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。通俗的来说:容器适配器就是将其他容器进行了封装,底层是通过别的原创 2021-10-04 10:01:09 · 200 阅读 · 7 评论 -
STL之List的模拟实现
STL之List的模拟实现List的模拟实现List的模拟实现#include<iostream>#include<assert.h>namespace nrf{ template<class T> struct _list_node { _list_node<T>* _next; _list_node<T>* _prev; T _data; _list_node(const T& val = T())原创 2021-10-03 14:45:00 · 307 阅读 · 4 评论 -
STL之List的初识
STL之List的初识一、List的介绍二、List的使用1.List的构造2.List迭代器的使用常见容器的迭代器迭代器失效问题一、List的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列原创 2021-10-01 10:25:45 · 417 阅读 · 7 评论 -
STL之Vector的模拟实现
STL之vector的模拟实现vector核心接口的模拟实现vector核心接口的模拟实现#include<iostream>using namespace std;namespace vr{ template<class T> class vector { public: typedef T* iterator; vector() :_start(nullptr) ,_finish(nullptr) ,_endofstorage(null原创 2021-09-30 09:26:36 · 357 阅读 · 7 评论 -
c&c++的内存管理
c&c++的内存管理一、内存区域划分二、动态内存管理方式malloc/calloc/realloc和freenew/delete操作内置类型new和delete操作自定义类型一、内存区域划分栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据原创 2021-08-16 10:06:45 · 449 阅读 · 11 评论 -
vecto迭代器失效
迭代器失效迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。对于vector可能会导致其迭代器失效的操作有:会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。原创 2021-08-09 16:54:43 · 372 阅读 · 0 评论 -
STL之vector的初识
STL之vector的初识一、vector的遍历1.使用for循环push_back2.迭代器3.auto一、vector的遍历1.使用for循环void test_vector1(){ vector<int>v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); for (size_t i = 0; i < v1.size(); ++i) { cout << v1原创 2021-08-08 18:00:43 · 123 阅读 · 3 评论 -
STL之string类的模拟实现
STL之string类的模拟实现一、四个默认成员函数构造函数和析构函数拷贝构造和运算符重载二、string类的增删查改关于const的描述遍历[]+for迭代器一、四个默认成员函数构造函数和析构函数 class string { public: string(const char* str = "") :_str(new char[strlen(str)+1]) { strcpy(_str, str); } ~string() { delete[] _str;原创 2021-08-05 19:56:22 · 399 阅读 · 1 评论 -
STL之String类
C++之string类STL初识什么是STLSTL的六大组件为什么学习string类c语言中的字符串string类的常用接口说明string类对象的容量操作三种遍历STL初识什么是STLSTL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的六大组件为什么学习string类c语言中的字符串C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些原创 2021-07-26 16:27:11 · 274 阅读 · 15 评论 -
c++的类和对象详解
一、面向过程和面向对象的初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。二、类的引入类:是定义出一个新的类型。类由两部分构成:1.成员变量(属性)2.成员函数(做的行为)C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。typedef int STDataType;struct Stack{ void Init(int in原创 2021-06-05 22:07:14 · 1307 阅读 · 21 评论