
C++学习
文章平均质量分 51
强大的RGG
五道口混子研究生,干饭大队队长!
专注于高性能C++编程,略懂机器学习和语音增强算法。知乎同名。
展开
-
2023总结
随着各大应用程序开始发送自己的年终总结,我的2023也只剩最后的几个小时了 ,我的2023可以说是过的还算顺利,但是也算是一路坎坷,希望2024,我的本命年能够让我过的顺利点。原创 2023-12-31 21:29:14 · 821 阅读 · 0 评论 -
提高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 · 593 阅读 · 0 评论 -
无锁队列学习
加锁是一种悲观的策略,它总是认为每次访问共享资源的时候总会发生冲突。无锁是一种乐观的策略,它假设线程访问共享资源不会发生冲突,所以不需要加锁。原创 2023-06-10 11:44:28 · 110 阅读 · 0 评论 -
从生产者-消费者模型中学习互斥量,锁,条件变量
是一种互斥的同步原语,用于保护共享资源的访问,确保在同一时间只有一个线程可以访问共享资源。通过对互斥量加锁和解锁,可以实现对共享资源的独占访问。,提供了更高级别的互斥操作。它是基于互斥量的封装,可以通过构造函数或成员函数的方式对互斥量进行加锁和解锁。轻量级的互斥量包装器,用于自动获取互斥锁并在作用域结束时自动释放锁。它会按照参数的顺序来进行加锁,并确保在作用域结束时以相反的顺序释放锁。C++17引入的互斥量包装器,可以同时锁定任意数量的互斥量,还可以。共享锁的互斥量包装器,用于实现共享所有权的线程同步。原创 2023-05-25 16:45:32 · 1008 阅读 · 0 评论 -
C++ 之 写一个自己的异常类(exception)
semp;&semp;这篇文章主要是介绍如何继承标准异常类写一个自己的异常类,重点是如何重写what函数。下面是示例代码。原创 2022-12-28 14:29:41 · 1085 阅读 · 0 评论 -
C++必须掌握的知识点
函数对象:重载“()”的类其对象称为函数对象,也叫仿函数。函数对象可以有自己的状态,也可以作为参数进行传递。(也可以使用function模板类进行传递和接收)。谓词:返回bool类型的仿函数称为谓词,接收一个参数的叫一元谓词,两个参数叫二元谓词。原创 2022-12-25 17:10:39 · 505 阅读 · 0 评论 -
C++中sort函数加一个比较器
【代码】C++中sort函数加一个比较器。原创 2022-12-22 15:32:05 · 454 阅读 · 3 评论 -
C++字面量杂谈
std::hexfloat可以将浮点数格式化为十六进制的字符串std::defaultfloat可以将格式还原到十进制。原创 2022-10-19 21:04:52 · 808 阅读 · 0 评论 -
C++ 之 constexpr详解
14天阅读挑战赛这是一种很实用的编程的方法,可以利用 enum 的特性促使编译器在编译阶段计算常量表达式的值,如下代码:生成的中间代码为:C++14中对constexpr进行了大量的改进constexpr lambdas 表达式从C++17开始,lambda表达式在条件允许的情况下都会隐式声明为constexpr。从中可以看出,lambdas 表达式在编译阶段就已经计算出了值。但是要注意constexpr表达式退化的问题(就是退化成普通的函数)constexpr 的内联属性代码中,num是原创 2022-10-19 20:30:45 · 783 阅读 · 3 评论 -
C++ 非受限联合类型
在联合类型中多个对象可以共享一片内存,相应的这片内存也只能由一个对象使用。在上面的代码中联合类型U里的成员变量x1和x2共享同一片内存,所以修改x1的值,x2的值也会发生相应的变化,反之亦然。原创 2022-10-13 17:40:11 · 480 阅读 · 0 评论 -
const,volatile,mutable
1》volitate: cpu每次读取数据的时候,如果寄存器或者三级缓存中有该值,则直接使用,所以此时如果内存中的值被改变,值不会改变。如果加上volitate每次绕过寄存器和缓存直接从内存读取,此时内存中的值已经改变了。《2》mutable: 1、在lambal表达式中,如果捕获按值捕获,但是在函数体中想要修改,可以使用mutable。原创 2022-10-06 17:18:06 · 455 阅读 · 0 评论 -
C++的左值,右值
C++11 引入了右值引用,我写本篇文章的目的就是为了加深自己对左右值的理解,帮助大家在日常编程中用好左右值,也是方便自己以后复习。链接如何区分左右值有一个最简单的方法就是,左值可以取地址,位于等号左边,右值不能取地址,位于等号右边。右值引用可以直接指向右值,也可以通过std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。作为函数形参时,右值引用更灵活。虽然const左值引用也可以做到左右值都接受,但它无法修改,有一定局限性。所以在写函数的时候形参尽量使用右值引用。原创 2022-10-04 19:18:57 · 1025 阅读 · 0 评论 -
C++ 之 tuple
tuple其实就可以理解成pair的拓展。原创 2022-09-30 20:59:27 · 847 阅读 · 0 评论 -
C++之可变参数模板
可变参数模板是模板编程时,模板参数(template parameter)的个数可变的情形,可变模板参数(variadic templates)是C++ 11新增的最强大的特性之一,它对参数进行高度泛化,它能表示0到任意个数、任意类型的参数。/*用宏的方式(/*用宏的方式)/*用宏的方式(/*用宏的方式,/*用宏的方式)/*用宏的方式+/*用宏的方式(/*用宏的方式,/*用宏的方式,/*用宏的方式)/*用宏的方式+/*用宏的方式add_2(/*用宏的方式。原创 2022-09-30 19:02:18 · 2173 阅读 · 0 评论 -
位运算符的优先级,如何判断一个数是否是2的幂,以及求不大于这个数的最大2的幂
如果 n & (n-1) 的值为0 则是 2的幂。原创 2022-09-22 21:40:22 · 155 阅读 · 0 评论 -
C++之initializer_list,可变参数模板参数展开方法
模板initializer_list是C++11新增的,可以使用初始化列表语法将STL容器初始化为一系列值,在使用 { }来进行初始化的时候,其实是调用了将作为参数的构造函数。原创 2022-09-21 20:14:55 · 1575 阅读 · 0 评论 -
C++:CRTP(Curiously Recurring Template Pattern 奇异递归模板)
什么叫静态多态和动态多态静态多态也称为编译器多态,编译器在编译期根据函数的实参类型推断出要调用那个函数。例如:函数重载和函数模板动态多态也就是运行时多态,是指在程序执行期间判断所引用的对象的实例类型,然后根据实际类型调用相应的方法。例如:通过基类类型的引用或者指针调用虚函数什么是CRTP是Curiously Recurring Template Pattern的缩写,中文翻译可以写成奇异递归模板,是一种把子类类型作为模板参数传给基类的一种模板技巧。原创 2022-09-18 17:30:46 · 717 阅读 · 0 评论 -
STL之优先级队列(priority_queue)
最近在刷算法题的时候遇到了需要使用堆来解决的问题(尤其是TOPk问题),所以想把这些方法总结一下,防止后面忘记了还得到处找资料。希望能帮助到大家参考链接1参考链接2对通常是一个可以被看做一棵树的数组对象,满足两个条件1,堆中的某个结点的值总是不大于或者不小于其父结点的值2,堆是一颗完全二叉树根结点最大的数叫做大根堆,最小的叫做小根堆。堆排序中建堆的时间复杂度为O(n)在C++STL中没有堆的数据结构,所以借助其中的priority_queue(默认是大根堆)......原创 2022-07-19 20:34:08 · 4109 阅读 · 0 评论 -
STL 中的 stack 和 queue
C++标准库是有多个版本的,三个最为普遍的STL版本如下:栈和队列都是被称作为container adapter而不是被称作container,这是因为栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的低层结构,如果要自己指定底层的实现方法如下:队列底层指原创 2022-07-12 14:50:24 · 362 阅读 · 0 评论 -
c++之bitset
bitset用来管理的是一系列bit位,用法类似于string,只不过里面的每一个是bit。头文件是 #include如下代码中的注释所示,bitset可以用string和整形进行初始化,但是当有溢出的时候保留的情况是不一样的。以上代码的运行结果如下:这里面要注意的是,bitset的索引是从右向左的。以上代码的运行结果是:具体看bitset是如何实现的可以去看看源码原创 2022-06-01 17:02:27 · 1034 阅读 · 0 评论 -
手写一个布隆过滤器(Bloom Filter)
布隆过滤器的c++实现原创 2022-06-01 15:37:06 · 301 阅读 · 0 评论 -
c++中对文本进行读取经常使用的方法总结
getline函数getline有四种重载形式: 1. istream& getline (istream& is, string&str, char delime) 2. istream& getline (istream&& is, string&str, char delime) 3. istream& getline (istream& is, string&str) 4. istream& get原创 2022-05-21 10:42:57 · 959 阅读 · 0 评论 -
CMake使用
linux系统目录结构:文件编辑:vim:gedit:源代码优化: 所谓优化就是省略掉代码中从未使用过的变量,直接将常量表达式用结果值代替等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。指定库文件或者指定库文件路径(-l -L):指定头文件搜索目录(-I):-wall 打印警告信息,-w 关闭警告信息 ,-std = C++11 设置编译标准 -D定义宏生成静态库:静态库归档的命令:ar rs libAwap.a Swap.o生成动态库:.原创 2022-05-07 17:16:29 · 3102 阅读 · 0 评论 -
关于vscode中配置c++环境的一些总结(launch.json task.json)
首先如果你是初学者或者是对c++从源码到可执行程序过程不是很清楚的同学先不要用VSCode写c++,不然你会很痛苦。下面简单介绍下vscode配置的一些方法,授人以鱼不如授人以渔,我只记录下配置的原理,这样就能进行个性化配置,体会到VSCode的强大了:本文参考链接工程文件中的.vscode文件夹就是运行当前工程的配置文件,主要用到的是launch.json 和 task.json后面我将教你如何配置。task.json主要是在你编译时候用到的,它的作用是告诉 VS Code 如何构建(编译)程序,原创 2022-05-06 16:37:45 · 12760 阅读 · 2 评论 -
c++ inline
可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题,因为他是把被调用的函数直接在调用处展开,避免了函数调用频繁使用栈空间。关键字inline必须与函数定义放在一起才能使函数成为内联函数内联函数一般只会用在函数内容非常简单的时候。这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。下面是代码比较:这是两端相同的代码,唯一的区别是一个func函数是普通函数,一个func函数是inlin.原创 2022-03-19 15:50:27 · 825 阅读 · 0 评论 -
c++ 虚函数表
虚函数的实现是基于虚函数表的, 虚函数的作用主要是实现了多态的机制.一般继承,无覆盖一般继承,有覆盖覆盖的f()函数被放到了虚表中原来父类虚函数的位置没有被覆盖的函数依旧。多重继承,无覆盖每个父类都有自己的虚表子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)多重继承,有虚函数覆盖参考链接-大神讲的虚函数...翻译 2022-03-19 11:24:39 · 120 阅读 · 0 评论 -
c++ static
static 修饰成员变量在函数内定义的静态成员变量,其作用域与普通成员变量一样,但是生命周期与整个程序一致。对基本类型的静态局部变量若在声明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。static 修饰全局变量静态全局变量的作用域只能是当前文件,而非静态的全局变量的作用域是整个程序(也就是各个源文件内都是有效的)static 修饰函数可以限制此函数的作用域只是当前文件。使用静态函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数原创 2022-03-14 23:24:25 · 503 阅读 · 0 评论 -
c++11 新特性总结
auto & decltype这两个关键字在编译期就推到出变量或者表达式的类型auto:可以通过=右边的类型推导出变量的类型decltype:用于推导表达式类型,只用于编译器分析表达式的类型,表达式实际不会进行运算。.........原创 2022-03-12 21:40:37 · 1322 阅读 · 0 评论 -
g++和gcc的区别,以及编译的过程,多线程
g++和gcc的区别:g++可以理解为gcc的超集,两者都可以编译c程序,但是遇到c++程序时,gcc则会出现错误。为什么g++既可以编译C又可以编译C++呢?因为g++在内部做了处理,默认编译C++程序,但如果遇到C程序,它会直接调用gcc去编译.编译的过程:图片出处...原创 2022-02-24 10:57:27 · 623 阅读 · 0 评论 -
unsigned char,char ,uchar ,UCHAR的区别
unsigned char,uchar ,UCHAR,这几个都是表示的无符号的char,其实都是unsigned char的宏定义,所以就是一个东西。char占一个字节,能表示 -128 到1271,计算机里面所有的数都是用补码表示的,正数的补码是其本身,负数的补码是原码的反码(符号为以外,其余的全部求反)加一。2,数字在计算机中是以二进制来存储的,最高位是符号位,0为正1为负3,表示正数时:0~127 0000 0000 ~ 0111 1111表示负数时: 1111 1111 ~ 1000原创 2022-02-24 10:26:53 · 7709 阅读 · 0 评论 -
用位运算来实现二分查找(>>)
1,mid = (left + right) >> 1 就相当于 mid = (left + right) / 2 但是运算的速度会变快很多。2,代码:class Solution {public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size()-1; int mid = -1; w原创 2022-01-03 10:56:33 · 559 阅读 · 0 评论 -
用进制工具解决排列组合问题(例:用组合工具求解单步路径图的最短路径问题)
1,用进制工具可以很好地解决排列组合问题,他并不会使运算的效率变高,但是会使代码变简洁。具体的思路是:首先用一个sizes数组保存每一步中可选结点的个数,然后创建一个长度和它相等的states数组来保存进位。然后用states来表示十进制的数,进而表示出不同种的情况。要注意的是普通的进制例如二进制每一位都是满二进一,但是使用进制工具的每一位的最大的数是由sizes数组对应位的值来控制的,即每一位的进制可能是不同的。再计算一共有多少种可能情况,这样每个十进制的数就可以对应一个states数组,从而表示原创 2021-11-29 17:30:00 · 398 阅读 · 0 评论 -
vscode在独立终端运行终端出现乱码的问题
出现的原因:VSCode 与 cmd 两者之间的编码方式不一样:VSCode 默认是 utf-8 编码,而在中国地区下的 Windows 的 cmd 默认是 GBK 编码。解决方法:vscode中文乱码问题解决方法原创 2021-10-28 11:19:45 · 427 阅读 · 0 评论 -
在排序数组中查找元素出现的第一个位置和最后一个位置(c++)
题目描述:Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.If target is not found in the array, return [-1, -1].You must write an algorithm with O(log n) runtime complexity.来源:力扣(Leet.原创 2021-10-12 10:45:17 · 652 阅读 · 1 评论 -
对于要对数组的长度奇偶性处理的方法
为了简化代码,不分情况讨论,我们使用一个小trick,我们分别找第 (m+n+1) / 2 个,和 (m+n+2) / 2 个,然后求其平均值即可,这对奇偶数均适用。加入 m+n 为奇数的话,那么其实 (m+n+1) / 2 和 (m+n+2) / 2 的值相等,相当于两个相同的数字相加再除以2,还是其本身。...原创 2021-10-05 22:46:00 · 291 阅读 · 0 评论 -
c++进行socket编程时出现导不了socket包的情况时的解决方法
问题描述:2,codeblocks的解决方法:在Other linker options中添加-lwsock32DEV的解决方法:也是在compliar Options 中进行设置tips:原创 2021-09-23 23:31:45 · 232 阅读 · 2 评论 -
c++字符串求长度的几种方法
1,str.length(), string的成员方法2,str.size(), string的成员方法3,strlen(), 参数是char* 类型原创 2021-06-26 12:59:24 · 5233 阅读 · 1 评论 -
关于c中char类型的一些理解
1,char x =a ; 和 char x = ‘a’ 的区别:前一个x保存的就是字符a,后一个x保存的是a的ascii码。2,有变量char t = ‘Y’时,判断的语句是:‘Y’== t,也可以用strcmp函数原创 2021-06-21 20:31:53 · 311 阅读 · 0 评论 -
如何计算星座
//判定星座 string constell_names[12][2]={ {"山羊座","水瓶座"}, {"水瓶座","双鱼座"}, {"双鱼座","白羊座"}, {"白羊座","金牛座"}, {"金牛座","双子座"}, {"双子座","巨蟹座"}, {"巨蟹座","狮子座"}, {"狮子座","处女座"}, {"处女座","天枰座"}, ...原创 2021-06-17 09:37:57 · 218 阅读 · 0 评论 -
求无重复字符的最长子串(C++解法)
题目描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子原创 2021-05-22 12:17:42 · 2220 阅读 · 0 评论