- 博客(42)
- 收藏
- 关注
原创 C++ 红黑树
/ 节点的颜色// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值域// 节点的颜色。
2023-11-04 21:58:10 199
原创 c++系列——智能指针
std::shared_ptr的线程安全问题通过下面的程序我们来测试shared_ptr的线程安全问题。上述的SmartPtr还不能将其称为智能指针,因为它还不具有指针的行为。指向堆上资源的线程安全问题是访问的人处理的,智能指针不管,也管不了。,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后。是的,引用计数的加减是加锁保护的。但是指向资源不是线程安全的。,就说明自己不使用该资源了,对象的引用计数减 一。引用计数的线程安全问题,是智能指针要处理的。,就说明自己是最后一个使用该资源的对象,
2023-10-30 00:23:45 161
原创 特殊类设计
为什么会产生设计模式这样的东西呢?使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模 式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
2023-10-29 23:49:36 230
原创 map和set
1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对 子集进行直接迭代。
2023-10-04 18:31:16 830
原创 二叉搜索树
再比如统计单词次数,统计成功后,给定单词就可快速找到其出现的次数,单词与其出 现次数就是就构成一种键值对。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二 叉搜索树的深度的函数,即结点越深,则比较次数越多。以词库中所有单词集合中的每个单词作为key,构建一棵二叉搜索树在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。最差情况下,二叉搜索树退化为单支树(或者类似单支),其平均比较次数为:N。b. 树不空,按二叉搜索树性质查找插入位置,插入新节点。
2023-09-30 23:31:05 88
原创 C++中的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。
2023-09-29 17:48:06 123
原创 priority_queue的介绍和使用
1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。empty():检测容器是否为空。
2023-09-23 21:53:10 188
原创 list的介绍及使用
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2023-09-22 00:07:26 426
原创 vector
1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。
2023-09-17 11:30:05 67
原创 类与对象(中)(二)
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用。这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容!注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定 义类型是调用其拷贝构造函数完成拷贝的。,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数返回值类型为类类型对象。
2023-05-24 20:45:31 891 1
原创 类与对象(中)(一)
内置类型就是语言提供的数据类 型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。6. 关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下,编译器会 生成默认的构造函数。下面的程序我们会看到,编译器 生成的默认析构函数,对自定类型成员调用它的析构函数。是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任 务。
2023-05-19 12:26:13 415
原创 Linux常见指令理解
在终端下敲ssh[ip]ip 为刚才看到的 ifconfig 结果. 如果网络畅通, 将会提示输入用户名密码. 输入即可正确登陆(有的 insert 需要配合 fn 来按)是不行的.
2023-05-17 00:24:30 432
原创 类与对象(上)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字ClassName为类的名字{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。一般情况下,更期望采用第二种方式。
2023-05-03 16:06:52 674
原创 数据结构——排序(下)
任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。3. 空间复杂度:O(N)
2023-04-16 23:01:41 63
原创 数据结构——排序(一)
当插入第i(i>=1)个元素时,前面的array[0],array[1],…:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;2.1.1基本思想: 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列。
2023-04-09 14:12:42 68
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人