c++
文章平均质量分 93
学习c++语法及stl中的vector list等容器
绵绵yu
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c++ 智能指针
智能指针通过RAII机制解决资源管理问题,确保异常安全。传统指针在异常发生时可能泄漏内存,而智能指针利用对象生命周期自动释放资源。C++11提供了三种智能指针:unique_ptr(禁止拷贝)、shared_ptr(引用计数)和weak_ptr(解决循环引用)。其中shared_ptr使用引用计数管理资源,weak_ptr则避免循环引用导致的内存泄漏。智能指针还支持删除器以处理特殊资源释放,并通过make_shared优化内存分配。循环引用问题可通过weak_ptr打破,它不增加引用计数,需通过lock()原创 2025-10-25 20:07:57 · 1097 阅读 · 4 评论 -
c++ 异常
本文介绍了C++异常处理机制,包括异常抛出(throw)和捕获(catch)的原理、栈展开过程以及异常与继承体系的关系。异常允许将错误检测与处理分离,通过调用链查找匹配的catch子句,若未找到则程序终止。文章还讨论了异常安全、资源释放问题,以及C++11的noexcept规范。最后通过模拟服务模块的异常处理示例,展示了如何利用继承和多态实现统一的异常处理框架,以及异常重新抛出的应用场景。异常处理机制为大型项目提供了更灵活的错误处理方式。原创 2025-10-24 16:10:13 · 1214 阅读 · 7 评论 -
c++11可变模版参数 emplace接口 新的类功能 lambda 包装器
可变模版参数 emplace接口 新的类功能 lambda 包装器--function bind原创 2025-10-19 18:00:34 · 651 阅读 · 3 评论 -
c++11 列表初始化 右值引用 移动语义 引用折叠 完美转发
中的解决方式只有使用。原创 2025-10-11 15:43:17 · 747 阅读 · 5 评论 -
红黑树封装实现map set
迭代器就按照list那里实现的方式一样 ++的逻辑就按照上面所分析的代码实现。原创 2025-09-19 21:29:52 · 801 阅读 · 2 评论 -
红黑树 详解
红黑树相较于二叉搜索树有了一个变量来存储每一个节点的颜色 而存的颜色顾名思义只有红和黑两种颜色 通过对任何⼀条从根到叶子的路径上各个结点的颜色进行约束 来实现它的功能黑红树的规则每个结点不是红色就是黑色根结点是黑色的如果一个结点是红色 如果它的孩子节点存在 则它的孩子结点一定是黑色的,也就是说任意一条路径不会有连续的红色结点。对于任意⼀个结点,从该结点通过任意一条路径到空节点,均包含相同数量的黑色结点如下图 就是符合要求的红黑树图 可以数一下从根到空节点的路径一共有多少条。原创 2025-09-17 16:10:20 · 1772 阅读 · 5 评论 -
AVL 树
在之前的二叉搜索树中提到 最坏的情况下每一层只有一个节点或者近似于这样情况的时候 插入查找删除的复杂度会退化为O(N)它的名字取决于发明者G.M.Adelson-Velsky和E.M.Landis两个前苏联的科学家在AVL树中 对于(不是0是因为 如果有偶数个节点的话不可能保证高度一样)AVL树实现这里我们引入平衡因子的概念那么如果这棵树满足AVL树 则(AVL树不是一定要有平衡因子的概念 实现AVL树也可以用其他的方式 在本文用平衡因子的方式来实现)原创 2025-09-16 12:23:57 · 1519 阅读 · 2 评论 -
set map题目练习 算法分析 代码实现
用set和map来解决1.环形链表II 2.两个数组交集 3.前k个高频单词 4.随机链表的赋值问题。原创 2025-09-13 18:25:07 · 1400 阅读 · 0 评论 -
map multimap认识及使用
所以此时pair里面的T1就是map的第一个参数Key T2就是map的第二个参数T 此时map里面Key类型的成员变量就是pair里面的first map里面T类型的成员变量就是pair里面的second。上面的first就是pair里面的第一个成员变量也就是map里面的key second是pair里面的第二个成员变量也就是map里面的value。map是支持[]重载的 之前的string和vector他们物理结构是连续的所以重载的[]很简单 但是map物理空间不是连续 它的[]需要一些设计。原创 2025-09-12 19:04:56 · 909 阅读 · 0 评论 -
set multiset认识及使用
关联式容器有map/set和unordered_map/unordered_set。在删除和查找上有些差异 有多个相同数的话 find会找中序的第一个数 比如里面有很多的5 在找到5之后会继续判断此时位置的左树里面有没有5了 直到找到一个此时位置的左树里面没有5了 此时的位置才是find要找的。在创建对象的时候 模版第二个参数传greater<int>这样左树的值都大于根节点值 右树值都小于根节点的值 这样begin指向的位置就是最左边节点的最大值 删除begin位置的节点也就是删除了最大值。原创 2025-09-11 20:24:00 · 836 阅读 · 0 评论 -
从c到 c++ 入门基础
首先 c++是兼容c的 也就是在c++中c的知识都可以使用第一个c++程序。原创 2025-07-24 19:50:23 · 555 阅读 · 0 评论 -
二叉搜索树
本文介绍了二叉搜索树的基本概念及详细实现方法。此外还探讨了二叉搜索树在日常生活场景中的应用,例如在小区门禁系统中用于车牌号的快速识别,以及实现单词翻译器。原创 2025-09-09 22:14:29 · 1947 阅读 · 1 评论 -
c++继承详解
继承是c++面向对象编程的三大特性之一 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段 它允许我们在保持原有 类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产⽣新的类,称为派生类。如下 我们看到Person是基类,也称作父类。Student是派生类,也称作子类。(因为翻译的原因 所以 既叫基类/派生类,也叫父类/子类。原创 2025-09-06 18:35:42 · 1438 阅读 · 0 评论 -
vector 题目练习 算法代码分析 代码实现
给一个vector<int> 里面有一个数字出现次数超过了数组长度的一半 找到这个数返回 如果是奇数个数 例如11 那个出现次数最多的就至少出现6次 如果是偶数例如10 那么至少出现6次。原创 2025-09-04 21:10:50 · 942 阅读 · 0 评论 -
string类 手动实现
c++委员会在std命名空间中定义了string类 在类中实现了许多对外的很多接口之前试过了string类接口的使用 接下来自己来手动实现一下于这样的string类 并不是真的和库中的一样 只是大概实现一些功能 加深一下对其底层的理解首先为了不和std中的string类冲突 我们自己定义一个命名空间xx在里面实现string类。原创 2025-08-09 21:36:36 · 888 阅读 · 0 评论 -
内存管理 动态空间申请
在c和c++中的内存区域主要有四个区域 栈取 堆取 数据段(静态区) 代码段(常量区)其中栈取主要存储着局部变量(函数参数等)和临时变量(返回值等)他们会随着函数栈帧的创建而创建随着其消失而消失堆取主要存储的就是动态申请的空间 如c中malloc calloc realloc这些所申请的空间 而在c++中动态申请空间用到的new静态区存储的是全局变量 和static所修饰的变量 他们的生命周期全局常量区存储的就是const所修饰的。原创 2025-07-31 20:49:56 · 620 阅读 · 0 评论 -
c++模版初阶
在c++中有了模版为什么要有模版呢如果要完成交换两个数的函数 在c中没有函数重载每一个类型都需要重写一个函数且函数名不能相同在c++中函数可以重载之后解决了函数名的问题 交换函数可以用一个函数名来实现 在使用的时候不管什么类型直接用这个函数名就可以了 但是在实现功能的时候 同样的逻辑每一种类型都需要写一个函数 函数里面的内容基本都相似 这样就感觉很麻烦1.代码复用率很低2.如果里面一个函数的逻辑出问题了 说明其他几个类型的也出问题了 要改起来也很麻烦所有在c++中引入了模板。原创 2025-08-01 22:02:12 · 504 阅读 · 0 评论 -
vector 认识及使用
先创建一个vector<vector<int>>类型的对象ss 用numRows个vector<int>进行初始化 这里没有传第二个参数 相当于每一个vector<int> 类型的对象都进行了默认的构造函数进行初始化 然后第一层for循环让每一层都保留i个数 没有的用1来填充 这样就相当于每一行的首位都初始化为了1。ve相当于下图的第二个里面存着10个vector<int>类型的值 里面的每一个对象相当于一个上面的全部 里面的每一个都存在10个int类型的值。原创 2025-08-14 21:25:47 · 1063 阅读 · 0 评论 -
vector 手动实现 及遇到的各种细节问题
如下图 原来vector存着四个string类型 每个string里面有一个指针指向堆区动态申请的空间 在开新空间之后用memcpy的方式只会把每一个string对象的指针和size cpapcity给拷贝过去 然后对于原来的空间会先把string对象str指向的空间给释放掉再释放掉旧的空间 此时新空间中存的指针指向的空间是已经被释放掉的空间。原创 2025-08-16 21:35:07 · 1620 阅读 · 0 评论 -
stack queue的实现 deque的底层结构 priority_queue的实现
1.deque的头插尾插效率高 比vector和list都好 (vector需要挪动数据 list只能一个一个空间来开辟deque能直接开一块 )2.支持下标访问 但是不如vector的效率高3.但是中间插入数据的时候 还是需要挪动很多数据(不能对里面某个数组进行扩容 否则会影响到其他接口 )所以deque适合只对头尾操作 需要支持偶尔下标访问的结构所以一开始的问题 stack和queue的第二个模版的默认缺省值为deque<T>就很合适 栈和队列只需要对头尾进行数据处理。原创 2025-08-30 22:38:05 · 1410 阅读 · 0 评论 -
stack 题目练习 算法分析 代码实现
要求我们实现一个能实现栈的插入删除获取栈顶数据 并能获取最小元素的功能的栈。原创 2025-09-05 22:56:36 · 1125 阅读 · 0 评论 -
string 题目练习 过程分析 具体代码
题目解析可能有多个单词 至少一个单词 要算最后一个单词的长度 这里还要求自己写输入的方式过程分析这里的输入不能用cin 因为遇到空格就直接结束这次的读取了 所以这里用getline(读到换行才会结束 或者自己手动选择结束的值)要算最后一个单词的长度 那我们只需要一直更新读到单词的长度就可以每个单词之间一定存在着空格 我们可以选择遇到空格就将读取到的长度清零 最后一个单词之前一定有空格读最后一个单词之前一定会清零 这样就将n里面存的最后一个单词的长度直到遇到‘\0’结束具体代码。原创 2025-08-19 22:55:53 · 1195 阅读 · 0 评论 -
模版进阶及分离编译问题
优点1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性缺点1. 模版没有被实例化之前检查不严格 编译错误通常出现在模板被使用的地方 不容易发现出错的地方2.模板会导致代码膨胀问题,也会导致编译时间变长3.可读性降低 增加了理解难度虽然模版有着一定的缺点 但是模版毫无疑问是一个非常伟大的发明 有着强大的泛型编程能力。原创 2025-09-02 13:19:40 · 1307 阅读 · 0 评论 -
list容器的使用
merge会把里面的list对象l2的内容剪切到lt中并排序好(其实里面的过程是先将两个list类型的对象分别排序好 然后按照类似于归并排序那里的方式每次从两个中找小的放到一个新的对象中 结束之后再把内容拷到lt中) merge之后 l2对象会清空。如algorithm算法库中的sort 其支持随机迭代器 可以把string和vector类型的对象进行排序 但是双向迭代器类型的list就不能使用 其实就是sort的实现用到的是快排的方式 而快排中的三数取中等逻辑只支持物理空间上连续的结构。原创 2025-08-25 21:51:56 · 1087 阅读 · 0 评论 -
类和对象补充
以下程序的结果是什么a1和a2都在初始化列表中显示写了 对于a1显然它的值为传过来的形参1 那么a2呢 它的值是a1的值 那么是a1的1 还是a1声明时候的2其实都不是 a2的结果为随机值或者0(取决于编译器)这就需要最后一点了。原创 2025-07-29 19:58:35 · 679 阅读 · 0 评论 -
c++ string类使用
大概如下图结构然后在string类中写了非常多的成员函数 运算符重载等对外实现了大量功能的接口。原创 2025-08-07 15:56:43 · 1013 阅读 · 0 评论 -
c++类和对象
我们不写构造函数编译器会自动调用它默认的无参的构造函数 只要我们写一个构造函数 这个默认的就不会调用了 会调用我们自己写的的那我们写一个带参的构造函数 就没有无参的构造函数了 此时构造函数就必须传参数 我们创建对象时候就必须给它传参数c++有两种类型 内置类型(基本类型)和⾃定义类型。内置类型就是提供的原⽣数据类型, 如:int/char/double/指针等,⾃定义类型就是我们使⽤class/struct等关键字自己定义的类型。原创 2025-07-26 20:19:19 · 900 阅读 · 0 评论 -
c++ 多态
多态的实现依赖于继承机制,它允许子类通过重写(覆盖)父类的虚函数,在继承体系下动态地改变或扩展特定行为,从而满足不同子类的个性化需求。原创 2025-09-08 22:51:32 · 1381 阅读 · 0 评论 -
list 手动实现
尾插要先给先新节点newNode申请一个空间 插入之前要先保存一下插入之前的最后一个元素的地址到prev 然后断开之前最后一个元素和头结点的连接 然后让prev的_next指向newNode newNode的_prev指向prev head的_prev指向newNode newNode的_next指向head。迭代器在对外使用上我们其实就可以把它当做节点类型的指针 (里面的唯一成员变量就是节点类型的指针 在类里面对这个成员变量的操作 类型对外的表现上像指针一样 且实现的功能由里面的重载决定)原创 2025-08-28 21:56:28 · 1689 阅读 · 0 评论
分享