- 博客(29)
- 收藏
- 关注
原创 C++的vector使用优化
当你创建一个vector,然后使用push_back添加元素,当当前的vector的内存不够时,会从内存中的旧位置复制到内存中的新位置,然后删除删除旧位置的内存,也就是说当我push_back,vector容量不够添加元素就会调整大小,重新分配,这也就是将代码拖慢的原因之一。当我们在push_back的时候,我们实际是在,主函数的当前帧中构造它,所以我们在main的栈上创建它,然后我们需要做的是,把它放到这个vector中,所以我们是从main函数中(把这个创建的vertex)放到实际的vector中。
2024-06-03 22:27:46
843
原创 C++之动态数组
C++给我们提供了一个叫Vector的类,这个Vector在std命名空间中。这个Vector有点像一个集合,一个不强制其实际元素具有唯一性的集合,和数组一样,但是和C++普通的数组又不太一样,和标准的数组不同当你创建Vector时,你不需要给他一个边界值,只需要把元素放进去就好了,你每放一个元素进去,这个数组大小会自动增长。上面的注释已经写的非常清楚了,就不赘述了。
2024-06-03 16:55:03
377
原创 C++的箭头操作符
在C++中,引用是已存在变量的别名。一旦一个引用被初始化为某个对象,它就不能再被改变为引用另一个对象。引用在语法上表现得就像一个变量,但实际上它并不拥有自己所引用的对象的内存空间。在C++中,指针是一个变量,它存储了另一个变量的内存地址。运算符首先解引用指针(即获取指针指向的对象的地址),然后调用该对象的成员函数。的任何访问都将是未定义的,因为它们都指向了同一个不再存在的对象。都是有效的,因为它们都在做同样的事情:先解引用指针。这是使用指针调用其指向对象的成员函数的常见方式。的引用,而不是副本。
2024-05-30 10:28:48
348
原创 牛客刷题(选择题)
A 三十行的 i:hello (i∈[0,30]) 和一行 30:hello world。B 三十行的 i:hello (i∈[0,30]) 和一行 31:hello world。1.在32位系统下运行以下程序,可能的输出结果为()C 多行的 i:hello (i∈[0,30] )D 多行的 i:hello (i∈[0,31])
2024-05-29 20:23:30
163
原创 C++的复制和拷贝构造函数
第一个例子int main()int a = 2;int b = a;//实际是创建一个副本,他俩是独立的变量,它们有不同的内存地址(复制)b = 3;//是可以修改的第二个例子float x, y;int main()//复制的是值,是吧a的值给了b,他们是两个不同的变量,占用的是两个不同的内存b.x = 5;//a中的x(a.x)还会是2第三个例子float x, y;int main()
2024-05-28 09:48:32
412
原创 C++之智能指针
我们前面说new delete这些时,new在堆上分配内存,需要delete来删除内存,释放内存,因为堆不会自动的释放内存,而智能指针实现这一自动化的一种方式,这个就是智能指针,当你调用new时,不需要调用delete。shared_ptr共享指针:他的工作方式是引用计数,引用技术其实是一种方法,可以跟踪你的指针有多少个引用,一当引用计数达到0,他就删除了,看下面这个例子。unique_ptr 作用域指针,也就是超出作用域时,它会被销毁,然后调用delete。
2024-05-24 09:54:40
201
原创 C++的对象生存期
该内存的大小有限,在终端执行: ulimit -s 可以查看当前系统栈内存的使用上限,我们使用虚拟机ubuntu的栈内存使用上限是8192kb,一旦超过这个限制就会产生段错误。该内存段会随着程序的执行自动的分配(定义局部变量、块变量)、释放(函数执行完毕自动释放局部变量、块变量),虽然使用比较方便,但它的释放不受程序控制,长期使用的数据不能存储在栈内存中。作用域指针,是一个指针的包装器,构造时用堆分配指针,然后再析构时删除指针,所以我们可以自动化这个new 和 delete 比如下面这个例子。
2024-05-21 22:30:08
265
原创 C++练习反转链表
解题思路:三指针倒回来,首先建立一个pre指针为空,用来存储反转后的数据,接着在来一个node指针指向头指针(head)之后,当head有值时,就把head-next指向pre实现反转的效果,然后将head=node node=head—>next实现遍历的效果,最后返回pre即可实现。给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。要求:空间复杂度 𝑂(1)O(1) ,时间复杂度 𝑂(𝑛)O(n)。
2024-05-17 10:22:19
327
原创 C++中的隐式转换和explicit关键字
因为他是const char数组 dajian6个字符加一个空的终止字符,如果要让他正常实现打印,我们需要两次转换,一次const char 到string 一个是string到Entity,但是它只允许一次隐式转换,所以我们有两种方法,一种是包装在一个构造函数中,还有一种则是包装在Entity对象中。),但是他没有,这里就是我们要说的隐式转换,也叫隐式构造,可以隐式的将22转换成一个Entitiy,构造出一个Entity,因为我们的实体类中有构造函数一个接受整数参数,另外一个接受字符串作为参数。
2024-05-16 09:44:55
205
原创 C++之new关键字
栈内存是由编译器自动分配和释放的,其分配和释放的速度很快,但栈空间的大小是有限的。的生命周期是确定的,它存在于其定义的作用域内(例如函数内部)。,并在堆上为其分配了一个未初始化的整型变量的空间。int a = 2;类中有需要初始化的资源(如动态分配的内存、文件句柄等),这些资源在使用。,你不需要担心其内存的分配和释放问题,因为编译器会自动处理这些事情。)的,其分配和释放的速度相对较慢,但堆空间的大小通常远大于栈空间。操作符来释放其占用的内存,否则会导致内存泄漏。将被自动销毁,其占用的栈内存也会被自动释放。
2024-05-16 08:47:50
494
原创 创建并初始化C++对象(堆和栈的区别)
该内存的大小有限,在终端执行: ulimit -s 可以查看当前系统栈内存的使用上限,我们使用虚拟机ubuntu的栈内存使用上限是8192kb,一旦超过这个限制就会产生段错误。该内存段会随着程序的执行自动的分配(定义局部变量、块变量)、释放(函数执行完毕自动释放局部变量、块变量),虽然使用比较方便,但它的释放不受程序控制,长期使用的数据不能存储在栈内存中。该内存段由程序员手动调用内存管理函数(malloc/free),进行分配、释放,它的分配释放受程序员的控制,适合存储一些需要长期使用的数据。
2024-05-14 10:29:48
314
原创 C++的const和mutable
const添加在int类型前保护的是变量的值,但是可以改变指针的指向,我们只是不能改变指针指向的内容。这里的关键在于const是加在*之前还是之后,如果想让指针本身变成常量,不能重新分配指针指向,那就加在*之后变量名之前。在这个代码中,我们是不能修改a的变量值的,因为加了const进行了保护。为了更好的理解const在函数中的作用,也就是const 的第三种用法,他和变量无关,而是在方法名之后(只在类中生效)const就类似与一个保镖一个承诺,用于保护变量,他的优点有很多。
2024-05-13 21:14:11
171
原创 C++引用和指针
那如果或要打印出来为6这个函数应该怎么改:我们首先要用指针把这个变量的地址先传过去,通过地址来对变量的值进行改变,当拿到变量的地址后进行一个逆向引用得到变量的值后自增。这样就能打印出6了这个是指针的方法,引用的方法就是给a取个别名value 然后value++ 就和a++ 一样的。引用其实就是变量的一种别名,在上面的例子里首先我们让a=5 ,然后给a记了一个别名ref 最后让ref=2 其实就是 a=2改变了a的值,最后打印a的值是2。另外需要说明的是,当你使用1、引用时要初始。
2024-04-17 16:13:52
151
1
原创 C++ 之循环
我们可以对比一下这普通写法和B哥写法,第一种方法就不赘述了(1.for循环里首先执行的是i=0 2.然后执行{ }里的内容,之后3.自增“ ++ ”一下 ,最后才4.是判断),我们看看B哥写的,其实B哥就是用了for循环的特点,首先定义 i 以及一个 flag ,里面为空就默认true,也就是1阶段直接过到2阶段之后自增,在用I
2024-04-14 22:59:57
191
1
原创 不使用modbus库使用C语言实modbustcp 的 03功能码读保持寄存器
【代码】不使用modbus库使用C语言实modbustcp 的 03功能码读保持寄存器。
2024-03-06 14:13:37
570
1
原创 C++学习之什么是变量
其实编程的大部分操作都是操作数据,我们在程序中使用任何数据,包括改变他的读写属性,或者是把着数据存储进去,那存储到哪里去呢?就是变量里(在程序运行过程可以变化的量,它是存储数据的容器,需要先定义才能使用)。但我们创建一个变量时,它会被存储在内存中(堆或栈 后面或细致说明内存时怎么工作的),其实不同的变量他们之间最大的区别就是这个变量会占用的时多少的内存(也就是不同数据类型之间的区别)。我们举个例子,我们定义一个int 类型的数据,打印一下他的值(8),一般来说int(整型)是4个字节,但是我们要明白一点数据
2024-02-10 21:19:27
690
2
原创 C++链接器是如何工作的
看看结果,没错他报错了(链接错误),按正常来说我们注释了Multiply这个调用,那log不是也就没用到(log在Multiply函数中),那应该是对的才对啊!并不是这样的,因为在文件汇中,虽然我们没用用到Multiply函数,但是从技术上来说我们是可能在其他地方用到他的,所以连接器就需要链接他就会报错(因为找不到嘛),那么只要告诉链接器,Multiply不会再其他地方用到只会再这个里面用到就可以解决这个问题了,怎么解决呢?加一个static(这意味着Multiply函数只声明在Multiply.cpp中)
2024-02-07 19:19:15
334
3
原创 C++学习之C++编译是如何工作的
接着用我们之前那个hello world的代码来测试一下,直接把末尾的}替换成#include "dajian.h"然后我们clt+F7运行一下,可以看到是没有报错的也就是说编译器在这一步实现的就是打开这导入的文件然后复制到这里。打开文件我们可以看到生成以.i结尾的预处理文件,打开它查看一下,可以发现就是把我们写的dajian.h插入在那里了。接着我们玩点有趣的,在这Math.pp这段代码里加上#if 0 #endif,可以看到它空了,改回1那么.i的文件里的内容又会回来。
2024-01-27 18:48:06
350
1
原创 C++学习之深入了解“hello world”
main函数则是函数程序的入口,程序运行后会一行一行的执行main函数里的代码(不是绝对的,其中也可以中断,跳转),main函数有点特殊,我们可以发现他是int类型的,但是上面的代码中我们并没有给他一个返回值(mian函数没给返回值就默认是0),他也依旧正的执行了。接着我们可以发现其中有 <<这个特殊的符号,有点像C的左移对吧,但是他其实是一个函数的重载(后面会细说),作用就是把hello world这个字符串推送到cout流中,然后打印到终端。cin.get();(会在之后详细写一个编译执行的文档)
2024-01-27 16:04:43
184
1
原创 三分钟上手GDB
GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。
2023-10-29 15:30:49
62
1
原创 网络聊天室——tcp——socket——线程池
写了很多的小项目,但是都没来的及总结整理这些小项目,导致自己面试的时候在回答项目构建时模模糊糊,只记得个大概了。
2023-10-28 18:20:45
117
1
原创 c高级语言通用函数
当先输入数值型数据(整数形、浮点型),再输入字符型数据时,前一次的输入会残留一个'\n'或空格,影响字符型数据的输入,所以我们定义一个清理缓存的函数,clear_stdin;接着我们自定义一个输入函数:首先我们要清理掉他的缓存记录,使用strlen得到字符串的长度赋值给len 因为前面我们说过fgtes他的缺点是当他的字符数不足他的长度时,会连着‘\n’一起读入,如果输入的字符超过他的字符串长度,fgets只会从输入缓冲区中读取size个字符,剩余的数据会残留输入缓冲区中影响后续数据的输入。
2023-07-18 20:44:48
79
1
原创 指针day2
一级指针存储的是普通变量的内存地址,二级指针存储的是指针变量内存地址。类型* 一级指针;类型** 二级指针;注意:二级指针在使用方法上与一组指针不同,所以一般以pp结尾,让使用者从变量名上就能区别一级指针与二级指针。由指针变量构成的数组,也可以说它的身份是数组,成员是指针变量。类型* 数组名[n];就相当于定义了n个指针变量。// 相当于定义了10个int*的指针变量专门指向数组的指针变量,它的进步值是整个数组的字节数。类型 (*指针变量名) [n];
2023-07-13 22:31:33
65
1
原创 C语言进阶(程序的内存分段、变量的属性和分类)
该内存段会随着程序的执行自动的分配(定义局部变量、块变量)、释放(函数执行完毕自动释放局部变量、块变量),虽然使用比较方便,但它的释放不受程序控制,长期使用的数据不能存储在栈内存中。生命周期:当它所在的函数被调用后,执行到块变量的定义语句时块变量就会被创建(操作系统会给块变量的变量名分配一块stack内存),当出了它所在的大括号,块变量就被销毁了。当程序完成编译 静态内存的text data bss 三个内存段的大小就确定,在程序运行期间大小不会有任何的变换,可以使用size 来查看这三个内存段的大小。
2023-07-12 20:00:20
268
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人