- 博客(197)
- 资源 (2)
- 收藏
- 关注
原创 2023总结
随着各大应用程序开始发送自己的年终总结,我的2023也只剩最后的几个小时了 ,我的2023可以说是过的还算顺利,但是也算是一路坎坷,希望2024,我的本命年能够让我过的顺利点。
2023-12-31 21:29:14
818
原创 提高C++工程规范性的一些点
1,避免魔数2,不要返回局部变量的指针或引用3, 要注意变量的作用域4,注意平台移植性例如 尽量避免使用int ,long等,因为int在16位系统中占2个字节,long在32位中占4个字节,在64位中占8个字节。5,多用const来表达意图6,在必要时使用explict7,初始化列表效率更高8,多态,父类析构函数声明为虚函数9,STL中的容器类没有虚构函数10,构造时不能调用虚函数这是因为虚函数的调用要依赖于对象的虚表指针和虚函数表,而对象在未构造的时候没有虚函数指针。11
2023-12-29 16:32:43
589
原创 数组中指针不同加1的区别
array和&array的值是一样的,但是他们代表的意义完全不一样,array是数组首元素的首地址(和。“+1”就是偏移量问题:一个类型为T的指针的移动,是以sizeof(T)为移动单位。当数组名作为sizeof操作符和单目操作符&的操作数时。,而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个。一样),&array是整个数组array的首地址.后返回的指针便是指向数组的指针,跟a(一个指向。,而不是一个指向某个指针常量的指针。的指针)在指针的类型上是有区别的。
2023-10-18 17:18:30
266
原创 C++中线程管控
detach() 让线程在后台运行,其归属权和控制权都转移给C++运行时库(runtime library) 来保证一旦线程退出,与之关联的所有资源都会被回收;一般要求每个线程的函数是自含(self-contain)的,这样就能防止某个局部变量声明周期已经结束,但是仍然有线程进行访问它造成不可控的错误;每个线程只能调用一次join函数,只要调用过,线程就就不可再汇合( joinable() 返回值为false );任何可调用线程都适用于thread,包括函数指针,lambda表达式,函数对象等;
2023-07-19 16:56:55
748
原创 shell编程
shell编程也是属于一个C++程序员的基本功,由于是很久之前学的,很多细节在使用的时候都需要去查文档,于是最近趁着复习的时候总结了下在shell编程中常用的一些知识分享给大家。自定义变量时直接使用变量名=[变量值]进行定义,等号左右不能有空格,如果值本身就有空格,就用引号引起来。使用 export 将局部变量提升为全局变量,但是在子shell中更改变量的值后,父shell中的值不变定义只读变量撤销定义的变量unset aAction;] }函数返回值只能通过。
2023-06-15 10:55:23
514
原创 无锁队列学习
加锁是一种悲观的策略,它总是认为每次访问共享资源的时候总会发生冲突。无锁是一种乐观的策略,它假设线程访问共享资源不会发生冲突,所以不需要加锁。
2023-06-10 11:44:28
108
原创 从生产者-消费者模型中学习互斥量,锁,条件变量
是一种互斥的同步原语,用于保护共享资源的访问,确保在同一时间只有一个线程可以访问共享资源。通过对互斥量加锁和解锁,可以实现对共享资源的独占访问。,提供了更高级别的互斥操作。它是基于互斥量的封装,可以通过构造函数或成员函数的方式对互斥量进行加锁和解锁。轻量级的互斥量包装器,用于自动获取互斥锁并在作用域结束时自动释放锁。它会按照参数的顺序来进行加锁,并确保在作用域结束时以相反的顺序释放锁。C++17引入的互斥量包装器,可以同时锁定任意数量的互斥量,还可以。共享锁的互斥量包装器,用于实现共享所有权的线程同步。
2023-05-25 16:45:32
1005
原创 git常用命令
现在很多文章对git讲的非常高大上,一大堆命令,但是这些命令中的大部分都是用不上的,所以我对这些常用命令进行了总结(此篇文章建议基本了解git的看)
2023-03-09 09:21:49
355
原创 详解linux中网络的几种模式:NAT,网桥,以及静态IP的配置和主机名
自 17.10 开始,Ubuntu 已放弃在 /etc/network/interfaces 里设置静态 IP 的办法了,即使配置也不会生效,而是改成 netplan 方式 ,配置写在 /etc/netplan/01-network-manager-all.yaml 或者类似名称的 yaml 文件里(此处请注意 yaml 的语法格式)NAT就是网络地址转换,虚拟机和主机构建一个专有网络,通过NAT进行设备IP的转换,虚拟机通过共享主机的IP访问外界网络,但外部网络无法访问虚拟机。然后继续操作就可以了。
2023-02-01 19:48:03
1240
原创 Google编程规范
一、前言二、头文件三、类构造函数可拷贝类型和可移动类型struct和class接口存取控制和声明顺序四、来自Google的奇技所有权与智能指针cpplint五、其他C++特性六、命名约定(重点)七、注释(重点)八、代码格式(重点)九、结束语昨天听了雷军的演讲,感受还是很多的,最大的感想就是我之前很喜欢的一句话:在奋力往前走的时候别忘了有时要抬头看看天。努力很重要,甚至是非常重要,但是方向和把握机会的能力也是至关重要的。
2023-01-05 20:58:58
1478
原创 C++ 之 写一个自己的异常类(exception)
semp;&semp;这篇文章主要是介绍如何继承标准异常类写一个自己的异常类,重点是如何重写what函数。下面是示例代码。
2022-12-28 14:29:41
1060
原创 LeetCode刷题之406 根据身高重建队列(贪心算法)
然后对人数进行排序处理,可以把每个结点的k当作再people数组中的index,因为现在的people已经是身高由大到小的序列了,如果按k的值进行插入,就可以得到满足要求的序列了。通过对题目的分析首先确定这是一个有两个维度的问题,一个是h(身高),一个是k(在前面比本身高或者相等的人数)。输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]可以看见性能得到了明显的提升。
2022-12-27 14:55:07
714
原创 C++必须掌握的知识点
函数对象:重载“()”的类其对象称为函数对象,也叫仿函数。函数对象可以有自己的状态,也可以作为参数进行传递。(也可以使用function模板类进行传递和接收)。谓词:返回bool类型的仿函数称为谓词,接收一个参数的叫一元谓词,两个参数叫二元谓词。
2022-12-25 17:10:39
503
原创 (吊打二维表中的搜索问题) LeetCode刷题之二维表中进行搜索的问题
在一个二维表中进行搜索是一种经典的题目,最常用的方法就是回溯法,是一种非常直观的方法。步骤方法名1构建visited数组,用来记录是否访问过当前结点2构建四个方向对,用来控制前进方向3搞清楚每一步是否满足题目条件(判别条件)下面我将用两个剑指offer中的例子来进行说明。
2022-11-02 17:21:58
197
原创 实现一个线程安全的双向链表(C++)
最近实现了一个线程安全的双向链表,使用的是C++类的模式写的,和以前学习数据结构使用struct结构体实现的方式不同,对函数进行了封装,以及使用了C++中的类模板,还有unique_lock锁,对内存泄漏也进行了优化。以下是代码:(注意:请勿在业务代码中使用,代码未经过完全的测试)
2022-10-23 15:47:22
2041
原创 C++ 之 constexpr详解
14天阅读挑战赛这是一种很实用的编程的方法,可以利用 enum 的特性促使编译器在编译阶段计算常量表达式的值,如下代码:生成的中间代码为:C++14中对constexpr进行了大量的改进constexpr lambdas 表达式从C++17开始,lambda表达式在条件允许的情况下都会隐式声明为constexpr。从中可以看出,lambdas 表达式在编译阶段就已经计算出了值。但是要注意constexpr表达式退化的问题(就是退化成普通的函数)constexpr 的内联属性代码中,num是
2022-10-19 20:30:45
764
3
原创 剑指offer之35 复杂链表的复制
利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。这样再次遍历的时候,当前结点复制结点的random就是指向当前结点random的下一个结点,最后再把原始结点和复制结点分离开就行了。把原来的A->B->C 变换成 A->A1 -> B->B1->C->C1。(不得不说,同样的思路,官方给的代码的优美程度直接碾压我)。
2022-10-14 10:56:28
79
原创 C++ 非受限联合类型
在联合类型中多个对象可以共享一片内存,相应的这片内存也只能由一个对象使用。在上面的代码中联合类型U里的成员变量x1和x2共享同一片内存,所以修改x1的值,x2的值也会发生相应的变化,反之亦然。
2022-10-13 17:40:11
477
原创 const,volatile,mutable
1》volitate: cpu每次读取数据的时候,如果寄存器或者三级缓存中有该值,则直接使用,所以此时如果内存中的值被改变,值不会改变。如果加上volitate每次绕过寄存器和缓存直接从内存读取,此时内存中的值已经改变了。《2》mutable: 1、在lambal表达式中,如果捕获按值捕获,但是在函数体中想要修改,可以使用mutable。
2022-10-06 17:18:06
450
原创 C++的左值,右值
C++11 引入了右值引用,我写本篇文章的目的就是为了加深自己对左右值的理解,帮助大家在日常编程中用好左右值,也是方便自己以后复习。链接如何区分左右值有一个最简单的方法就是,左值可以取地址,位于等号左边,右值不能取地址,位于等号右边。右值引用可以直接指向右值,也可以通过std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。作为函数形参时,右值引用更灵活。虽然const左值引用也可以做到左右值都接受,但它无法修改,有一定局限性。所以在写函数的时候形参尽量使用右值引用。
2022-10-04 19:18:57
1013
原创 C++之可变参数模板
可变参数模板是模板编程时,模板参数(template parameter)的个数可变的情形,可变模板参数(variadic templates)是C++ 11新增的最强大的特性之一,它对参数进行高度泛化,它能表示0到任意个数、任意类型的参数。/*用宏的方式(/*用宏的方式)/*用宏的方式(/*用宏的方式,/*用宏的方式)/*用宏的方式+/*用宏的方式(/*用宏的方式,/*用宏的方式,/*用宏的方式)/*用宏的方式+/*用宏的方式add_2(/*用宏的方式。
2022-09-30 19:02:18
2168
原创 C++之initializer_list,可变参数模板参数展开方法
模板initializer_list是C++11新增的,可以使用初始化列表语法将STL容器初始化为一系列值,在使用 { }来进行初始化的时候,其实是调用了将作为参数的构造函数。
2022-09-21 20:14:55
1551
原创 C++:CRTP(Curiously Recurring Template Pattern 奇异递归模板)
什么叫静态多态和动态多态静态多态也称为编译器多态,编译器在编译期根据函数的实参类型推断出要调用那个函数。例如:函数重载和函数模板动态多态也就是运行时多态,是指在程序执行期间判断所引用的对象的实例类型,然后根据实际类型调用相应的方法。例如:通过基类类型的引用或者指针调用虚函数什么是CRTP是Curiously Recurring Template Pattern的缩写,中文翻译可以写成奇异递归模板,是一种把子类类型作为模板参数传给基类的一种模板技巧。
2022-09-18 17:30:46
709
原创 python中如何画语谱图
plt.subplot(2,3,1)也可以简写plt.subplot(231)表示把显示界面分割成2*3的网格。其中,第一个参数是行数,第二个参数是列数,第三个参数表示图形的标号。Librosa是一个用于音频、音乐分析、处理的python工具包,一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有,功能十分强大。
2022-09-17 20:12:59
2418
2
原创 语音增强用到的方法总结
tqdm:是一个快速的,易扩展的进度条提示模块,另外在西班牙语中还有I love you so much的意思。leave,如果是true显示所有的进度条,如果是None只显示第一个。miniters 在迭代中显示最小进度的间隔。__getitem__就是给一个item然后获取到对应的标签。desc=None,进度条前面的提示。参数:iterable=None,rang(起点,终点,步长)total,迭代元素的多少。ncols,输出信息的宽度。file,指定输出的路径。
2022-09-14 16:44:52
787
原创 6127LeetCode刷题之优质数对的数目(位运算)
链接https//leetcode.cn/problems/number-of-excellent-pairs。,有了这个思路后,题目就变成了求每个数中1的个数之后再进行组合求满足要求的数对个数。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。这题要掌握规律才能做的比较轻松,来源力扣(LeetCode)...
2022-07-24 18:00:44
1551
1
原创 STL之优先级队列(priority_queue)
最近在刷算法题的时候遇到了需要使用堆来解决的问题(尤其是TOPk问题),所以想把这些方法总结一下,防止后面忘记了还得到处找资料。希望能帮助到大家参考链接1参考链接2对通常是一个可以被看做一棵树的数组对象,满足两个条件1,堆中的某个结点的值总是不大于或者不小于其父结点的值2,堆是一颗完全二叉树根结点最大的数叫做大根堆,最小的叫做小根堆。堆排序中建堆的时间复杂度为O(n)在C++STL中没有堆的数据结构,所以借助其中的priority_queue(默认是大根堆)......
2022-07-19 20:34:08
4093
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人