C++效率掌握之STL库:list函数全解
为什么要学习list?什么是list? list 是 C++ 标准模板库中的一个容器,它实现了双向链表的数据结构。双向链表由一系列节点组成,每个节点包含一个数据元素和两个指针,分别指向前一个节点和后一个节点。在链表的任意位置进行插入和删除操作的时间复杂度都是O(1) 。这使得它在需要频繁插入和删除元素的场景下表现出色,比如实现一个任务调度器,需要不断地添加新任务、移除已完成的任务 list 也是一种很常用的容器,对于链表的处理提供了极大的便利性 list 的主要特征可总结为: list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 list 的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素 list 与 forward_list 非常相似:最主要的不同在于 forward_list 是单链表,只能朝前迭代,已让其更简单高效 与其他的序列式容器相比(array,vector,deque),list...
C++效率掌握之STL库:vector底层剖析
在学习本专题前,请详细学习有关 vector 的使用 传送门:C++效率掌握之STL库:vector函数全解 学习vector底层的必要性 vector 底层通过动态数组实现,学习其内存分配策略,能让我们明白如何避免不必要的内存分配和拷贝操作,迭代器失效问题、扩容策略等 vector类对象基本函数实现123456789101112131415161718192021222324252627282930313233343536373839namespace bit{ template<class T> class vector { public: typedef T* iterator; vector() :_start(nullptr) ,_finish(nullptr) ,_end_of_storage(nullptr) {} vector(const vector<T>&...
C++效率掌握之STL库:vector函数全解
为什么要学习vector?什么是vector? vector 是标准模板库(STL)提供的一个容器类,它是动态数组的一种实现。这意味着它可以像普通数组一样存储一组相同类型的元素,并且能根据需要自动调整自身的大小,例如,你可以创建一个存储整数的 vector,然后不断往里面添加或删除元素,它会自动管理内存空间 vector 类是和 STL 库一起问世的,string 函数是在 STL 库之前创造的,为了一致性简便性,vector 、list 等类都减少了一部分不必要的函数,也将 string 加入了 STL 库 vector 的主要特征可总结为: vector 是表示可变大小数组的序列容器。 就像数组一样,vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理 本质讲,vector...
【初阶数据结构】先来后到的秩序:栈和队列
栈的概念及结构 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则 数组可以用来实现栈,但这并不意味着栈的本质就是数组。数组是一种连续存储元素的数据结构,使用数组实现栈时,利用数组的索引来模拟栈的操作 12345678typedef int STDataType;typedef struct Stack{ int* a; int top; int capacity;}ST; 栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小 栈接口实现栈初始化12345678910111213void STInit(ST* ps){ assert(ps); ps->a = (STDataType*)malloc(sizeof(STDataType) * 4); if (ps->a ==...
C++效率掌握之STL库:string底层剖析
在学习本专题前,请详细学习有关 string 的使用 传送门:C++效率掌握之STL库:string函数全解 学习string底层的必要性 在 C++ 中,知道 string 是如何以字符数组的形式存储,以及字符串连接、查找等操作的时间复杂度,就可以避免在循环中频繁进行字符串连接操作,因为这可能会导致多次内存重新分配和数据复制,从而影响性能,而是选择更高效的方式,如预先分配足够的空间。同时,理解 string 底层对内存的管理方式,有助于优化内存使用,避免空指针和越界的情况出现 string类对象基本函数实现实现一个类首先先从其基本函数开始,包括构造函数、析构函数、内存管理等 简单实现一个空构造和字符串构造,因为还没写 string 流输出的运算符重载,先将 string 类转成 C 语言风格来输出 🔥值得注意的是: 注意变量声明的顺序要和初始化列表一致,也要注意变量初始化顺序对另一个变量的影响;=运算符重载:自我赋值是指对象在赋值时被赋值给自己,例如 s1 =...
C++效率掌握之STL库:string函数全解
为什么要学习string?什么是string? C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问 因此创建了string类,比STL库还要早出现,所以有一定的缺陷和冗余 string的主要特征可总结为: 字符串是表示字符序列的类 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作 string在底层实际是:basic_string模板类的别名typedef basic_string<char, char_traits, allocator>...
如何快速高效本地部署DeepseekR1大模型?保姆级教程 无惧隐私威胁
为什么要部署本地模型?DeepSeek 隐私政策中提到了关于用户输入信息收集的条款,无论你输入什么文本,以及上传什么文件都会被第三方机构所收集,所以如果是在进行相关的项目研究或者实验进展分析的时候,就很有必要对数据进行隐私保护,且本地部署是支持离线的 Ollama下载大模型不是一个双击就可以使用的.exe可执行文件,是需要平台来运行的一个东西,Ollama就是一个支持各种大模型本地部署的一个平台 ,用这个平台管理和大模型之间的输出和输入 首先浏览器中输入Ollama.com网址,选择第一个 然后点击这里的下载按钮 继续点击下载按钮,根据自己电脑的版本选择,我这里选择的是Windows系统 在浏览器右上角下载处等待下载完成 下载完后点击打开文件,弹出界面再点击Install下载,然后等待下载完成 Ollama在桌面上不会生成桌面图标,所以我们win+R打开运行窗口,输入cmd打开命令行 然后输入ollama...
C++传送锚点的内存寻址:内存管理
C/C++内存分布回顾程序中需要存储的数据:局部数据、静态数据和全局数据、常量数据、动态申请数据 常量和可变常量的区别 经常很多人以为加了const的变量就是常量,但其实不是的,这叫可变常量,例如 const int* ptr,其实还是可以修改的,它可以指向不同的常量整数,但不能通过该指针修改所指向的值。 🔥检查类型存储位置的小tips: 看地址存放是否相近,相近则存放在同一区域,相差巨大则存放在不同区域 C++内存管理我们直到在堆上动态开辟空间需要使用malloc,realloc等函数,不仅要保证前后类型一致,还要断言空指针,感觉还是太麻烦了,所以在C++使用了更简洁方便的动态开辟函数 内存申请通过new和delete操作符进行动态内存管理 🚩动态申请1个int类型的空间 1234567//Cint* p1 = (int*)malloc(sizeof(int));free(p1);//C++int* p2 = new int;delete p2; 🚩动态申请存储10个int类型的数组 1234567//Cint* p3 =...
C++时之律者的代码掌控:日期类计算器万字详解
传送门:日期计算器(网页版) 基本构造实现获取某年某月的天数12345678910int 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) || (year % 400 == 0))) { day += 1; } return day;} 口诀:(四年一润,百年不润) 或者 四百年一润 构造函数12345Date(int year = 1900, int month = 1, int day =...