自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(987)
  • 资源 (2)
  • 收藏
  • 关注

原创 python绘制特殊的柱状图

python绘制特殊的柱状图

2024-03-03 15:48:20 170

原创 C++常见问题:this指针做什么用的?

类中用const修饰的函数通常用来防止修改对象的数据成员,函数末尾的const是用来修饰this指针,防止在函数内对数据成员进行修改,而静态函数中是没有this指针的,无法访问到对象的数据成员,与C++ static语义冲突,所以不能。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码,那么成员函数如何知道要访问哪个对象的数据成员呢?

2024-02-27 20:33:48 218

原创 C++ STL:hashtable源码分析

当hashtable中插入的元素个数大于当前vector的容量时,会新建一个vector,新vector的容量是之前vector容量所在质数表里的下一个质数,如53的后一个是97,新vector的容量为97。函数将不同类型的key数据转换成统一的数值格式(如:const char *转换成特定的数值),以便hash函数进行取模处理,取模用的模值就是桶的数量值,也就是vector的容量。m不应该是进制数的幂,比如十进制的时候,m如果是10^n,那么结果总是和原始值的后n位相关的,这样冲突的概率会更大。

2024-02-27 15:18:55 958

原创 C++ STL:set/multiset、map/multimap源码剖析

对于一个map容器,每次插入、删除或者查找返回的迭代器,其指向的红黑树中node节点,对其使用迭代器,解出的值的类型是value_type,这是一个pair的包装类,红黑树中定义了它的Key为const Key,而其值的类型为T,这样对于每次返回的迭代器就可以实现,其中Key为const类型不能修改,对于实值不是const,可以修改。其中set跟multiset不一样的是,set插入的时候调用的是insert_unique(),而multiset调用的是insert_equal()。具体可以参考这篇文章。

2024-02-27 09:59:05 420

原创 C++ STL :红黑树rb_tree源码剖析

STL关联式容器map、set、multimap、multiset,绝大部分操作如插入、修改、删除、搜索,都是由其内含的红黑树来完成的。我下面会总结 STL中rb_tree怎么实现的。首先,rb_tree是红黑树,所以需要定义红色和黑色。然后需要定义 红黑树的节点。_Rb_tree_node_base定义了红黑树的节点类,从类中可以看出一个节点有颜色、父指针、左孩子指针、右孩子指针4个属性。然后定义了几个函数,可以找到以这个节点为根节点的红黑树的最大节点和最小节点。

2024-02-25 22:14:15 1011

原创 数据结构与算法:红黑树讲解

1.节点非红即黑。2.根节点是黑色。3.所有NULL结点称为叶子节点,且认为颜色为黑。4.所有红节点的子节点都为黑色。5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。

2024-02-25 20:33:17 668

原创 C++ STL:stack和queue的使用及源码剖析

然而,通过模板参数,用户可以指定其他类型的容器(如 list),只要这个容器支持 front(), back(), push_back(), 和 pop_front() 操作。尽管 deque 是默认选择,但用户可以通过模板参数选择其他容器,如 vector 或 list,只要这些容器支持 back(), push_back(), 和 pop_back() 操作。它提供了特定的接口( LIFO 栈操作),这些接口是通过封装另一个底层容器(如 deque, vector, 或 list)的功能实现的。

2024-02-19 10:59:02 469

原创 C++ STL:deque使用及源码剖析

include // deque属于std命名域的,因此需要通过命名限定// 定义一个int类型的双端队列a// 定义一个int类型的双端队列a,并设置初始大小为10// 定义一个int类型的双端队列a,并设置初始大小为10且初始值都为1// 定义并用双端队列a初始化双端队列b// 将双端队列a中从第0个到第2个(共3个)作为双端队列b的初始值// 将n[1]、n[2]、n[3]作为双端队列a的初值。

2024-02-18 12:16:46 988

原创 C++ STL:list和vector的比较

由于 vector 使用一段连续的内存空间来存储数据,这意味着当你访问 vector 中的一个元素时,相邻的元素很可能已经被预加载到 CPU 缓存中。当你遍历一个 vector 并访问它的元素时,由于数据连续存储,许多元素访问操作可能直接从缓存中进行,而不是从更慢的主内存中。由于 vector 的连续内存特性,可能会导致更大的内存预留(容量)以减少重新分配的频率,而 list 的内存使用更为紧凑,但每个元素需要额外的空间来存储前后节点的地址。Vector: 底层实现为动态数组,提供了一段连续的内存空间。

2024-02-15 20:42:14 1172

原创 C++ STL: list使用及源码剖析

push_front(),push_back(),pop_front(), pop_back()在insert和erase的基础上实现。如果指针node指向置于尾端的一个空白节点,node就能符合stl对于前闭后开区间的要求,这样以下函数便能轻易完成。链表最后使用一个指针指向环形链表的空白节点,空白节点指向头节点,这样就形成了一个环了。可以看出list节点是一个双向链表,next指向下一个节点,prev指向前一个节点。node是指向list节点的一个指针,可以使用这个指针表示整个环状双向链表。

2024-02-15 20:08:51 1118

原创 C++面向对象编程:explicit关键字

在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。所以explicit只能用于修饰只有一个参数的类构造函数,表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)// 不行, 调用的是CxString(int size), 且size等于'c'的ascii码, explicit关键字取消了隐式转换。

2024-02-07 21:37:22 770

原创 C++ STL: vector使用及源码剖析

没有备用空间,就需要扩充空间,它接受两个参数n和value,n指明了要申请的堆空间大小,value指明了要初始化这些堆空间的内容,并把它们传给另外一个函数allocate_and_fill() ,该函数才是真正的申请堆空间和初始化。动态增加大小,并不是在原空间之后接续新空间,(因为无法保证原空间之后上有可供分配的空间),而是以原大小的两倍来另外分配一块较大空间,因此,一旦空间重新分配,指向原vector的所有迭代器就会失。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新的元素。

2024-02-07 13:43:44 742

原创 C++ STL:迭代器特性 iterator_traits

STL的算法需要知道iterator的相关信息(iterator种类、iterator指向的元素的类型...),来决定使用最优化的算法。然而,原生指针本身并不是一个类类型,它们没有定义,但是标准库中泛型算法和容器希望迭代器都有上面提到的5种特性,但是对于原生指针,并没有任何结构定义。支持前面四种Iterator的所有操作,并另外支持it + n、it - n、it += n、 it -= n、it1 - it2和it[n]等操作。不同类型的迭代器支持的操作不同,在算法优化的时候需要用到。

2024-02-06 23:35:31 671

原创 C++泛型编程:typename和class关键字的区别

因为class给人的感觉总像是T应该是一个类,或者说是用户自定义的类型,而typename则更像是表明T可以是任意一种类型。在模板定义中,编译器默认不知道 T::SubType 是一个类型还是一个成员变量,因为在模板实例化之前,T 是未知的。假设有一个类 A,在这个类内部,定义了另一个类 B 或者一个类型别名 B。这里的 B 就是一个嵌套在 A 内的类型,即 A 的嵌套类型。C++的一般规则是,除了使用typename修饰之外,template内的任何标识符号都被视为一个值而不是一个类别(对象)。

2024-02-06 22:50:40 340

原创 CSAPP第六章存储层次结构:存储技术(SRAM和DRAM)

信息通过称为引脚的外部连接器进出芯片,每个引脚携带1位信号每个DRAM芯片都连接到某些电路,称为内存控制器。为了读取超级单元(i,j)的内容,内存控制器先发送行地址i到DRAM,随后发送列地址j。DRAM记忆单元对任何干扰都非常敏感,DRAM单元在大约10到100毫秒的时间内失去电荷。在DRAM芯片中,存储单元(位)被划分为d个超级单元,每个超级单元由w个DRAM单元组成。(1)静态RAM(SRAM)比动态RAM(DRAM)更快更贵。DRAM通过将超级单元(i,j)的内容发送回控制器来响应。

2024-02-06 19:43:22 470

原创 C++泛型编程:模板偏特化

我们可以指定一部分模板参数的具体类型,或对模板参数施加一些约束条件。类型时,我们希望有一个特殊的实现。这时,可以使用模板偏特化来实现。模板偏特化为模板提供特殊的实现,针对特定的模板参数或参数组合。在模板全特化,所有的模板参数都被指定了具体的类型。我们可以在泛化设计中提供一个特化版本。假设有一个类模板,有两个模板参数。假设当第二个模板参数是。

2024-02-06 19:32:38 144

原创 C++11新特性:thread_local

threadSpecificCounter是线程局部存储的变量,每个线程都有自己的拷贝,每个线程都会递增它,并模拟一些计算工作,同时更新共享资源sharedResource。每个线程都有自己独立的变量实例,而不是共享同一个实例,每个线程可以维护自己的状态,而不会相互干扰。通过使用 thread_local , 每个线程都可以独立地操作它们自己的计数器,而不会相互影响。thread_local是C++11 引入的关键字,用于声明线程局部存储变量。例:使用thread_local实现线程特定的计数器。

2024-01-25 21:10:09 181

原创 C++并发编程:互斥锁std::mutex和lock_guard的使用

对象离开其作用域时,会自动调用析构函数,该析构函数会释放锁。这确保了在任何情况下(包括由于异常等原因导致的提前退出),锁都会被正确释放,从而避免了忘记手动释放锁而导致的死锁问题。mutex 用于控制多个线程访问共享资源,确保在任意时刻只有一个线程可以访问该资源,避免数据竞争。这确保了同一时刻只有一个线程可以访问被保护的资源,从而防止多线程并发访问导致的数据不一致性。是 C++ 标准库中提供的一个模板类,用于在其构造时自动获取锁,在析构时自动释放锁。是 C++ 标准库中提供的一种用于多线程同步的互斥锁实现。

2024-01-25 20:56:27 258

原创 C++11新特性:模板函数的默认模板参数

函数模板是C++中一种通用的编程机制,允许编写可以处理多种数据类型的通用函数。函数模板使用一个或多个类型参数,允许程序员编写单个函数定义,可以适用于多个数据类型。C++98中引入函数模板与类模板,在模板类声明时可以允许其有默认模板参数,但不支持函数模板的默认模板参数。C++11中模板函数也可以有默认的参数。

2024-01-23 20:41:01 348

原创 C++11新特性:final/override控制

用于显式标识一个成员函数(通常是虚函数)是在派生类中重写(覆盖)了基类中的虚函数。这有助于提高代码的可读性,同时在编译时提供了检查,确保派生类中的函数确实是在基类中有对应的虚函数。final通常用在继承关系中中途终止派生类的重载。从接口派生的角度而言,final可以在派生过程中任意阻止一个接口的可重载性。C++98中,一旦在基类A中的成员函数fun被声明为virtual,对于派生类B而言,fun总是能被重载。当在基类和派生类中使用函数重载(override)时,通过虚函数机制可以实现运行时多态性。

2024-01-23 20:24:10 367

原创 C++11新特性:拓展的friend语法

关键字用于声明一个函数或类是另一个类的友元(friend)。被声明为友元的函数或类可以访问包含它的类的私有成员。关键字应当谨慎,因为它破坏了封装性,增加了类之间的耦合性。友元关系应该仅在确实需要访问私有成员的情况下使用。这样可以在模板实例化的时候确定一个模板类是否有友元,以及谁是这个模板类的友元。在C++11中,声明一个类为另外一个类的友元时,不需要使用class关键字。可以利用这个特性为类模板声明友元。

2024-01-23 19:58:20 368

原创 C++11新特性:非静态成员的sizeof

C++98只有静态成员,或者对象的实例才能对成员进行sizeof操作,对非静态成员变量使用sizeof不能通过编译。但在C++11中,对非静态成员变量使用sizeof操作是合法的。

2024-01-23 19:41:38 362

原创 C++11新特性:快速初始化成员变量

并且,C++98对类中就地声明要求非常高,如果不是整型或者枚举型的静态常量成员,就不可以就地声明,必须在构造函数中进行。C++11中,允许使用等号=或者花括号 { } 进行就地非静态成员变量的初始化。C++11引入了成员初始化列表,使得在类定义中直接初始化成员变量成为可能。在C++98中,类成员变量的就地声明通常需要在构造函数中进行初始化。

2024-01-23 19:30:34 374

原创 C++11新特性:noexcept

noexcept是 C++ 中的一个关键字,用于指示一个函数是否可能抛出异常。noexcept关键字有用途:(1)在函数声明或定义中,noexcept可以用于指示函数是否可能引发异常。(2)如果函数不会引发异常,可以将其声明为noexcept,以告知编译器该函数是异常安全的如果声明为noexcept的函数在运行时引发了异常,C++标准规定会调用,终止程序执行。被声明为noexcept,但它实际上引发了一个异常。由于myFunction被声明为noexcept,如果没有捕获该异常,程序将会调用终止执行。

2024-01-23 19:11:05 370

原创 C++并发编程:线程启动

这声明了一个名为my_thread的函数,这个函数带有一个参数(函数指针指向没有参数并返回 background_task对象的函数),返回一个 std::thread 对象的函数,而非启动了一个线程。启动了线程,需要明确是要等待线程结束(使用join()),还是让其自主运行。在一些情况下,线程运行时,任务中的函数对象需要通过某种通讯机制进行参数的传递,或者执行一系列独立操作;如果传入参数的对象中包含的指针和引用需要谨慎,用一个能访问局部变量的函数去创建线程是危险的(除非十分确定线程会在函数完成前结束)

2024-01-22 15:57:54 362

原创 大四复习:深入浅出解释拓扑排序

首先拓扑排序的定义如下:拓扑排序是一种对有向无环图的顶点进行排序的方法。它的主要目的是产生一个顶点的线性序列,使得如果在图中存在一条从顶点 A 指向顶点 B 的边,则在排序结果中,顶点 A 出现在顶点 B 之前。什么意思呢?我的理解拓扑排序 简单的说,就是 遍历一个没有环的有向图中, 按照箭头的顺序遍历节点。在上面一个有向无环图中,必须先访问a,才可以访问b或c;必须先访问b和c,才可以访问d。所以,图的拓扑排序为a,b,c,d 或者a,c,b,d如何实现拓扑排序?访问一个入度为0的节点。

2023-12-18 17:38:47 119

原创 枚举 LeetCode2048. 下一个更大的数值平衡数

如果n的位数是k,n它的下一个大的平衡数一定不会超过 k+1个k+1。直接遍历之后判断即可。

2023-12-09 11:40:00 172

原创 动态规划:LeetCode2008. 出租车的最大盈利

所以需要记录以每个位置结尾的ride。可以使用vector<vector<int>>来记录。,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。每个ride可以选或者不选,求选的最大值,可以使用。dp[i]表示到第i个位置ride的最大值。,请你返回在最优接单方案下,你能盈利。如果选择以i为end的ride ,那么。以i为end的所有ride和不选。如果第i个位置,不选,那么。个地点从近到远编号为。初始:dp[0]=0;

2023-12-08 11:08:27 127

原创 C语言字符串的常用操作

【代码】C语言字符串的常用操作。

2023-12-07 14:46:53 67

原创 dfs图遍历 LeetCode1466. 重新规划路线

因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部决定重新规划路线,以改变交通拥堵的状况。因为图是一个连通图,建图时把图看成一个无向图,实际存在的边权值为1,不存在的边权值为0,可以 从 顶点 0 遍历到所有顶点。请你帮助重新规划路线方向,使每个城市都可以访问城市 0。今年,城市 0 将会举办一场大型比赛,很多游客都想前往城市 0。每个城市在重新规划路线方向后都能到达城市 0。所以从0开始遍历,加上边的权值即可。如果遇到反向的边,结果加1。

2023-12-07 13:52:55 198

原创 树形dp acwing 285. 没有上司的舞会

dfs返回两个数,第一个数表示选root的最大值,第二个数表示不选root的最大值。思路参考,讲得非常清晰。

2023-12-06 12:24:12 41

原创 深度优先搜索LeetCode979. 在二叉树中分配硬币

vector<int>dfs(node *root):表示以root为根节点的树中 节点个数 和 金币个数 ,v[0]表示节点个数,v[1]表示金币个数。在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。移动可以是从父结点到子结点,或者从子结点移动到父结点。二叉树中每一条边会连接一个子树,这个子树多的硬币会经过这条边,少的硬币会从其他地方运到该子树。所以每个边被经过的次数,就是该边对应的子树中 节点个数 和 金币个数之差 的绝对值。个结点的二叉树的根结点。

2023-12-05 19:13:15 138

原创 深度优先搜索(DFS)LeetCode 2477. 到达首都的最少油耗

题目汽油数,可以转换为每一条边的需要的车辆数,因为最大容量固定,进而转化为每一条求每一条边经过了多少个人,进而转化为求每条边连接的邻接点的子树的节点个数。城市里的代表可以选择乘坐所在城市的车,或者乘坐其他城市的车。在使用dfs遍历邻接点的时候,如果相对每个子树都进行相同的操作,在for循环里面写。个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从。每条边需要的车 = 每条边经过的人数/ 最大容量 上取整。每条边经过的人 = 该边 邻接点子树节点的个数。题目可以抽象为一个以0为根节点的树。

2023-12-05 17:37:56 94

原创 C++ vector建立无向图并遍历

如果题目中,以[[1,2],[1,3],[1,4],[2,3],....]这种方式给出边。可用使用vector建图。然后遍历每一条边,假设遍历时两边的顶点分别为a,b。如果是无向边,则可添加顶点。首先定义一个二维的vector。图的遍历:假设遍历a点的邻接点。

2023-12-05 16:48:41 78

原创 如何使用gdb调试fork程序

GDB调试默认跟踪父进程,

2023-12-04 17:06:06 144

原创 使用gdb调试正在运行的程序

可以看到进程已经停止运行,在gdb中对进程进行调试。写一个一秒打印一个数的c程序,并编译运行。查到进程编号为218239。查看该进程的进程号。

2023-12-04 13:58:47 50

原创 二叉树遍历 LeetCode 1038. 从二叉搜索树到更大和树

从图中可以看出,每个节点是BST右中左遍历时,遍历到的节点的值加上之前所有节点的值。在遍历时可以使用一个全局变量,表示之前所有节点的值,并维护这个变量。的值替换成树中大于或者等于该。

2023-12-04 11:27:37 101

原创 前缀和 LeetCode1423. 可获得的最大点数

所以 结果 = max pre[i] + post[ n-(k-i-1)]如果正常写需要写两个for循环,分别求前面的点数和、后面的点数和。每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿。,每张卡牌都有一个对应的点数。你的点数就是你拿到手中的所有卡牌的点数之和。post[i]表示第i~第n个数的和。pre[i]表示第1~第i个数的和。假设前面拿i张,后面则拿k-i张。所以可用用前缀和和后缀和来预处理。,请你返回可以获得的最大点数。

2023-12-03 11:26:16 102

原创 前缀和 LeetCode1094 拼车

因为from和to小于1000,所以可以使用大小为1000的数组path,表示每个点上车和下车的人数之差。然后对path求前缀和,如果前缀和大于最大容量,说明超载返回false.当且仅当你可以在所有给定的行程中接送所有乘客时,返回。这些位置是从汽车的初始位置向东的公里数。乘客,接他们和放他们的位置分别是。向一个方向行驶(也就是说,

2023-12-02 10:55:47 109

原创 CSAPP第11章:共享文件

内核用三种相关的数据结构来表示打开的文件。每个文件表的表象组成 有当前文件位置、引用计数(当前指向该表项的描述符表项数),一个指向V-node表中对应表项的指针。关闭一个描述符会减少相应的文件表项中的引用计数。内核不会删除这个文件表表项,直到它的引用计数为0。3.v-node表。同文件表,所有的进程共享这张v-node表。每个表项包含stat结构中的大多数信息。描述1和4 通过打开不同的文件表表项来引用两个不同的文件(没有共享文件,每个描述符对应一个不同的文件。

2023-12-01 14:47:04 47

eclipse连接hadoop

eclipse连接hadoop所需的配置文件和jar包。 使用说明: 参考博文:https://www.cnblogs.com/supiaopiao/p/7240308.html Tips: 上面网站中的第六步,打开eclipse的右上角有个田字格,选择Map/Reduce。 可能存在没有Map/Reduce字样的情况 解决方法: https://www.cnblogs.com/2016-zck/p/10298631.html

2022-05-16

南邮程序设计周作业_图书管理系统.zip

程序设计周作业

2021-11-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除