C++
少玩游戏多看代码
这个作者很懒,什么都没留下…
展开
-
C++指针与数组之间的联系
可以看到,对于用指针定义的数组,我们把指针向后移动一位,甚至可以继续访问arr[0]和arr[1],而且它们也是对应的第二位和第三位。使用new来新建对象,一定要记得delete,养成好习惯。不delete不会报错,但是不优雅。C++指针和数组基本上是等同的,这是C和C++非常强大的一点,当然也带来过许多麻烦。但是,还是上面那句话,这两个基本上是等同的。,这个arr可以理解为指向数组头元素的指针,也可以理解为数组。当然,只有指针可以“++”“–”,数组名是不行的,,那么你再执行“arr++”就会报错。原创 2023-03-17 19:58:03 · 413 阅读 · 0 评论 -
Vector的扩容机制
到需要扩容的时候,Vector会根据需要的大小,,然后把旧数组的元素复制进新数组。我们可以看到,。所以扩容之后,原先的迭代器会失效:插一嘴,为什么要用迭代器而不用指针。Iterator(迭代器)用于提供一种方法。第二,迭代器不是指针,它是类模板。它只是通过重载了指针的一些操作符(如“++”、“->”、“ * ”等)来模拟了指针的功能。也因此,它的功能比指针更加智能,他可以根据不同的数据类型实现不同的“++”等操作。执行后,只有第一个cout输出了结果,第二个cout没有输出,直接程序结束。原创 2023-03-17 12:23:31 · 2538 阅读 · 0 评论 -
C++中为什么使用new而不使用malloc
对于string、vector等类,如果你的构造函数没有正确执行,你初始化得到的可能是一堆奇奇怪怪的值。所以大多数情况下,都使用new,不要用malloc,除非你真的明白你在做什么。,有size个,因为初始化size个Stuff对象,每个都执行一次打印。如果调用B的话,我们不会看到打印信息,查询i的话,得到的也是0。而且查询i的话,i的值也是9810,说明。如果调用A的话,我们会看到打印出来的。“正在执行构造函数”原创 2023-03-14 22:14:37 · 309 阅读 · 0 评论 -
构造函数和析构函数
因为C++不想Java等语言,后者对于基础类型的数据,比如int、char之类,在定义的时候就自动初始化为0或者默认值了,但是C++的话,如果你不显式地初始化你的数据,他给你的就是野值。那么我们可以将它的构造函数声明为Private,这样在试图实例化这个类的时候,它就会调用构造函数,然后Private是不能被外界访问的,所以就直接报错。前者就是在类被创造的时候,自动调用的函数,后者是在类被销毁时,自动调用的函数。我们可以想象这样的运用:像Log这样的类,我们一般只希望调用它的成员函数,比如。原创 2023-03-15 12:42:44 · 51 阅读 · 0 评论 -
异步读取以及lambda表达式
也就是执行到C的时候,C直接返回了,然后继续执行DE;(比如asio的asyn_read_some,就是在执行到它时,马上就会返回,让主程序执行后面的命令。但是它自己却挂在后台,等候buffer中有东西可以读了,它再去执行自己的作用,再去读)所谓同步,就是正常的程序逻辑,ABCDE,假如C是一个耗时的IO操作,系统就会在执行到C的时候,等候C完成。这样的话,只要是支持+运算的数据,都可以直接用这个函数了。当然,这是最经典的一种异步的例子,异步还有很多各种应用场景,总之只要不是同步的,就都是异步的。原创 2023-03-14 17:08:30 · 961 阅读 · 0 评论 -
vscode C++ 显示找不到文件
这种情况,直接给他加一个这个参数就好了。原创 2023-03-13 22:22:31 · 3861 阅读 · 0 评论 -
二分法心得
这里注意,如果整个数组里就不存在target,target是一个很大的数,那么最终left=len,访问溢出了。首先,我们建议左右区间全部用闭区间。这时外面的框架不变,还是闭区间,还是一样的循环结束条件。但是里面的搜索条件变了。比如搜索左边界的话,我们的。其他两个条件不变,还是在寻找target。所以他们最终会找不到target,最后一次是。,也就是左边界的位置,返回left即可。,这时我们需要往左收缩区间,也就是。进入while循环,结束条件是。注意计算mid时,不要用。访问右边界是一样的原理。原创 2023-02-13 16:08:39 · 381 阅读 · 0 评论 -
内联函数(宏定义的替代品)
1.内联函数内联函数由inlline标明,例如inline double square(double x) { return x * x; }通常用它来代替函数原型。它的作用是,在编译的时候,将调用函数部分替换成函数的代码,这样就不用 编译器记下当前地址,将参数存入堆栈,调到函数定义地址,拿出参数进行运算,(将return值放入堆栈,)返回记下的当前地址(,取出return值) 这一系列操作。...原创 2020-07-24 07:44:09 · 199 阅读 · 0 评论 -
在C++的string或者vector等地方,用erase时注意
for(auto it = s.begin();it!=s.end();it++) { if(!standard(*it)) { s.erase(it); //it--; } }拿string来举例子。如果这么写就出问题了。因为erase之后,当前it指向的元素就会被删除,it指向下一个元素,而for的结尾又来一次it++...原创 2020-05-28 16:08:26 · 130 阅读 · 0 评论 -
多次定义同一个变量会影响效率吗?
事实上,类似于for这种循环体内,定义的变量,每次循环用的都是同一块内存。因此,如果是系统内置变量比如int这种,就没有影响;如果是涉及到类等自定义类型,因为需要反复地创建和析构,会对时间效率有影响。...原创 2020-05-22 10:06:20 · 442 阅读 · 0 评论 -
迭代与递归的解释
https://www.jianshu.com/p/32bcc45efd32转载 2020-05-07 18:25:47 · 120 阅读 · 0 评论 -
vector的使用
1.一个vector被塞入vector数组之后,留存的是它的数值,而不是引用。比如vector A(1,2,3)塞入数组B,然后改变A的值为(4,5,6),再把A塞入数组B。现在数组B有两个vector,一个是(1,2,3),一个是(4,5,6)。2.查找vector中是否存在某元素:bool is_element_in_vector(vector<int> v,int elem...原创 2020-04-21 11:42:12 · 122 阅读 · 0 评论 -
C语言之指针free后为什么还要刻意指向NULL
为指针变量动态分配一个空间,释放后为什么还可以给指针所指向的空间的那个变量赋值?int * p = (int *)malloc(4);*p = 4;printf("*p = %d\n", *p);free(p);*p = 5;printf("*p = %d\n", *p);不是说释放后,*p应该没有权限读和写了吗,怎么还可以赋值成功,不赋值也可以读出一个垃圾值?答:动态指针是在堆...原创 2020-04-09 20:01:15 · 4553 阅读 · 0 评论 -
sort排序的用法
https://www.cnblogs.com/stones-dream/p/10183210.html原创 2020-04-07 19:14:52 · 152 阅读 · 0 评论 -
初始化Bool数组
bool arrayName[arraySize] = { 0 };即可。如果bool arrayName[arraySize] = { 1 };只会让第一个变成true,其他的都还是false。原创 2020-04-03 12:00:30 · 1343 阅读 · 0 评论 -
如何在子函数中改变原函数中的 数组值/指针指向
改变数组的值直接传数组名即可,然后对数组里的元素进行更改。因为数组名已经指定地址了,不需要其他处理。改变指针的指向char* A,B;go(&A, &B)void go (char** A, char** B){ *A = *B;}这样A就指向和B一样的地址了。同理(*A)++也可以让主函数里的A向右偏移。...原创 2019-09-06 10:27:05 · 1759 阅读 · 0 评论 -
C++函数传数组时要注意,需要显式地传入数组长度
#include &amp;amp;lt;iostream&amp;amp;gt;const int ArSize = 8;int sum_arr(int arr[], int n);int main(){ int cookies[ArSize] = {1,2,4,8,16,32,64,128}; std::cout &amp;amp;lt;&amp;amp;lt; cookies &amp;原创 2019-01-29 16:06:03 · 304 阅读 · 0 评论