自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(171)
  • 收藏
  • 关注

原创 linux中使用socket通信的时候无法连接的问题原因

可能是你禁止了对应的linux工具使用相应的网络,所以其无法传送,一般是专有网络等,可以在设置里面允许其访问这些网络这样就可以传输成功了。

2024-06-18 09:33:59 67

原创 c++11 lambda匿名函数

就是一个没有名字的函数,和匿名对象类似,其只会在所在行起作用。举个例子: 我们之前使用过sort()排序函数,其可以根据你传入的一组数据,根据某种规则进行排序,规则我们既可以自己指定,也可以使用默认(sort()默认是从小到大排序,如果是C语言的话这个必须得自己指定)。如果,我们希望自己指定排序规则,,使用函数指针,sort()函数会对其进行回调。,就是一个类中重写了函数调用运算符()的函数,然后sort内部也可以进行调用。

2024-06-09 16:43:10 696

原创 c++ namespace以及使用建议

下面,我们自定义两个命名空间,然后对齐都进行using,内部包含一个同名函数,当我们去调用getAge()的时候会报错,因为,你同时using的两个命名空间中都有这个函数,编译器不知道用哪个,这就是。当然,将using namespace放到头文件中那更是不行的,因为头文件会到处包含,包含其的文件中可能也存在using namespace,这时候很容易出现下面的问题。在写c++代码的时候,经常会使用标准库中的函数,使用之前我们必须在前面添加一个std::,因为c++标准库的函数是在命名空间std下定义的。

2024-06-08 11:49:20 364

原创 reserve函数使用注意事项

但是,在你没有向内部取放数据的时候其还不属于你,所以,在你v1.reserve()之后直接去访问内存会出问题。[] 不具备开辟空间的能力,其只是访问对应的空间,但是这篇空间虽然已经预留,但是它还不属于你,所以你无法访问。我们之前提到过,在vector动态开辟空间的时候,如果空间不够其会重新开辟,然后进行数据拷贝,这会带来一定的性能问题。就是reserve函数会根据你传入的数据,在一块内存中找到对应长度的连续空间,先预留起来,也就是不会被别的数据占用。注意这块内存目前还不是你的,只是预留下来给你用的。

2024-06-04 12:58:33 198

原创 offsetof宏 -- 获取结构体或者类中数据偏移

所以,此处Type中int类型为最大的类型,占用4字节,所以其偏移值必须是4的整数倍,所以这时候就会发生内存对齐,char本来占用1个字节,发生内存对齐之后,为4字节,偏移就是0-3,因为结构体数据是连续存储,所以接下来的a的偏移就是4,这样其的偏移值就是4的整数倍了,又因为此类型最后一个类型为char,值占用一个字节,这样占用的总字节数为4+4+1 = 9 ,并不是4的倍数,所以又会发生内存对齐,对齐到12,这时候就是4的倍数了,所以这个结构体占用的空间是12个字节。那么为什么偏移值为8呢?

2024-05-30 14:03:11 285

原创 vprintf

【代码】vprintf。

2024-05-30 09:52:33 285

原创 c/c++内存操作函数

这些函数在字符串操作函数的那一节提到的函数好像都是类似的。区别在于,那块的函数主要用于操作字符串,这里的函数用于操作内存。简单来说就是可以操作任何类型,因为其参数接受的是void*类型的(任何类型的指针都可以隐式转换为void*类型的指针)如果你是要操作字符串,那么可以使用相应的字符串操作函数,如果是要操作别的类型,那么可以使用这里提到的函数。

2024-05-28 10:10:52 871

原创 C语言常用字符串处理函数

C语言中包含了很多对字符串处理的函数,要使用这些函数,首先需要导入头文件例: char *str = "abcde";// 结果为5strlen()计算的结果是字符串所占有的字节数。

2024-05-27 12:23:41 737

原创 结构体常见问题

int x;int y;}pos;定义一个结构体,其内部又定义了一个同类的结构体变量,这是一种错误。(因为如果你在结构体内部定义自己类型的结构体变量,在定义结构体的过程中,它会不断地去创建新的结构体变量,一直递归下去,没完没了) -- 有的编译器会检测到这种错误的写法。我们可以在结构体内部放一个指向自己类型的指针,这样就不会出现上面的问题了。int x;int y;}pos;

2024-05-27 09:06:01 339

原创 为了可读: 使用typede给函数指针类型取别名(c++中也可以使用auto自动推导)

在这行代码中,我们使用了函数指针,但是你会发现函数指针的类型很晦涩,所以为了更加的可读,我们不建议直接使用这种类型。,这样咋后面定义函数指针的过程中,使用别名定义即可,就不需要写像代码中这种类型了。对于上面的代码函数指针类型为: void (*)();,同样也不用写这种晦涩的类型)

2024-05-26 15:32:22 122

原创 求两个整数最大公约数的方法

可以使用递归来实现,编写gcd函数返回最终的结果(最大公约数)。传入两个参数,如果存在一个数字不大于0就返回0,利用上面的公式就可以得出最后的结果。

2024-05-26 09:57:08 99

原创 c++11 auto类型推导的使用建议和注意事项

首先c++是强类型语言,也就是在定义变量的时候必须指定具体的类型。像我们常用的int,float,char等等都是类型,auto关键字原本的意思是说明某个变量是自动变量,c++11提升了它的功能。在c++11之后,我们可以使用auto来进行类型推导。// int// long// float// double// char// Student 自定以类型。

2024-05-25 15:28:58 596

原创 无符号整形(size_t)使用时候的注意事项

(但是请注意: 对于负数而言,有符号数和无符号数的值可能不仅仅是正负的区别,数值上也是不一样的,比如: 1000 0001 : 有符号数为: -1 , 无符号数为: 129)// 这行打印语句的输出结果为1,也就说明后面的比较表达式返回的结果是1,也就说明s1-s2的值是大于0的,但是对于有符号数而言它的结果是-1,应该比0小才对。所以:上面所说的问题出现的原因是: 你在声明变量的时候使用的是无符号数,因为这个变量不会为负,但是如果两个无符号数相减,那么小的减去大的。那你看下面的打印语句。

2024-05-24 12:15:40 242

原创 C语言中的可变参数

函数的参数是函数的一个重要的组成部分,但是,我们平时指定的参数都是固定的。比如:func(int a,int b);如果当函数的参数个数很多的时候,我们可能要写很多的向上面一样的参数,显然效率不高。那么有没有一种方式可以改善。C语言中提供可变参数,比如printf()就使用的是可变参数,我们只需要在前面传入一个字符串,后面就可以指定任意的个数的数据,这是因为它使用的就是可变参数。那么下面来谈论可变参数如何自己使用。

2024-05-23 15:44:30 329

原创 C语言使用Eratosthenes筛选法来获取素数

【代码】C语言使用Eratosthenes筛选法来获取素数。

2024-05-23 14:59:51 96

原创 堆空间和栈空间的区别(主要说分配)

所以堆空间和栈空间的区别主要在分配,这也能直观的看出为什么栈空间的效率高,所以我们应该优先选择栈空间,当然如果需要用到堆空间的时候,依然要使用堆空间。(例如: 需要大空间,变量的生命周期由自己控制,函数返回数据等等)。

2024-05-22 22:15:27 940

原创 使用另外一个整数的位替换某个整数一定范围的位

【代码】使用另外一个整数的位替换某个整数一定范围的位。

2024-05-22 15:46:35 204

原创 位数组,以及自己实现的相关的操作

位数组就是存储的都是0,1的数据,因为程序中无法直接使用二进制,所以我们使用最接近的char类型的数组来表示位数组。可以更加方便的进行操作。

2024-05-22 12:29:15 79

原创 c++翻转一个无符号数的二进制位

看下面代码: 注意我们使用的数据类型并不是一个字节,所以说不一定是八位,而且不同的系统一个字节对应的位数有所不同。就是将一个数对应的二进制位进行相应的翻转,比如: 0000 0101 翻转之后: 1010 0000。

2024-05-22 11:01:43 195

原创 如何将对应数字转换为字符或者将字符转换为数字

给定一个数字7,将其转换为字符'7'。或者 给定一个字符'7',将其转换为数字7。

2024-05-21 10:01:29 205

原创 c/c++使用void*实现类型通配

这个函数是我们自己编写,然后传入到调用的函数中去的,所以其内部需要提供一些功能,就是帮助调用函数中需要访问或者操作void*数据的部分,我们可以调用这个函数来实现,因为这个函数使我们自己提供的,我们知道自己此时要处理的具体类型,所以可以根据需求在函数指针指向的函数内部将void*转化为具体的类型,然后进行操作。我们封装一个函数,比如是一个比较函数,用于比较两个数据的值, 如果我们将参数的类型写死,那么这个函数就只能去处理此种类型的数据,对于其它的类型我们还需要进行函数的重载。进而实现一个函数处理多个类型。

2024-05-20 12:15:55 159

原创 c++11 tuple元组

tuple也是一个类模板,所以,当我们需要存放多个不同类型的数据的时候,可以使用tuple。函数如果要返回多个不同类型的时候,也可以使用tuple。

2024-05-20 11:04:53 690

原创 使用模板传入具体的类型的数据

但是,我们前面说到,模板如果我们不去使用它,它就是一个模板,不真实存在。所以,上面我们在类模板的成员定义一个数组,数组的大小由一个模板参数SIZE指定。在没有使用的时候,它不真实存在,所以这样写没有问题。我们知道,在c或c++中定义数组的时候,数组的大小必须在编译的时候就得确定,所以我们在正常情况是不能使用变量来指定数组长度的。它是一个具体类型的数据,我们这里传递它的目的是作为数组的下标。在c++标准库中的array其实和此场景是类似的,我们在使用的过程中需要传递一个整数来指定内部数组的大小。

2024-05-19 16:35:40 120

原创 priority_queue:底层用堆实现

STL中的优先队列,底层是使用堆的结构实现的,如果我们在一定场景中需要使用到堆的结构,就可以使用priority_queue来表示。(默认情况是最大堆)

2024-05-19 10:36:04 96

原创 c++, 函数返回多个数据(相同类型或者不同类型)

我们在函数中,有时候会需要返回多个数据,一般有以下几种方式。

2024-05-19 10:33:44 285

原创 c++: ->运算符的用法 -- 获取结构体和类中元素偏移

首先,Student的首元素为int类型的,所以其第二个元素的偏移值就是sizeof(int) = 4字节;我们要找到第二个元素,就直接用Student的首地址(指针stu记录的地址)加上4,就可以得到第二个元素的地址了。(这里使用的是Student的指针,如果是直接创建对象也是类型的,变量的地址就是首地址)上面的代码,我们将地址0转换为对应的类,然后去访问内部数据。对于开辟的Student的空间,其存储结构大致是这样的,->运算符对于指针来说是很常用的,也很方便。问题: 0的地址不是禁止操作的吗?

2024-05-17 10:02:04 249

原创 c++ std::vector 的优化使用

我们往vector中存放数据的时候,如果vector的空间不够了,那么它就会在内存的另外一个位置,重新开辟一块足够存放数据的内存,然后将以前内存中的数据拷贝到新内存,然后将新增数据也放到内存中,最后将以前的旧内存释放带掉。首先这段代码,会先创建一个Student()的对象在函数的堆栈内存上,然后将该内存的数据存放到vector管理的内存上,这就要将堆栈位置的数据拷贝到vector对应的内存。其不会在函数的堆栈内存中创建对象,而是直接在vector管理的空间上使用传入的参数,调用对应的构造函数,创建对象。

2024-05-15 14:28:18 352

原创 代码技巧: 类中同一个函数可以同时存在常函数版本和普通函数版本(c++)

鉴于上面的情况,我们即使使用mutable也无法满足,因为mutable是让const函数修改属性,一旦设置const的对象和非const的对象就都可以修改了,并不能像上面那样进行区分。如果有下面的场景,假设我们有一个函数hobby()需要在非const的对象调用的时候,应该去修改内部的属性,在const修饰的对象调用的时候可以满足不修改内部的属性。当const的对象去调用此函数的时候,会调用到const修饰的版本,这样就不会修改属性。一个是被const修饰的,一个是不被const修饰的。

2024-05-14 22:40:59 185

原创 c++string类型

string类型是c++的字符串类型,其继承自basic_string类。c++string是否是写时复制?(像Qt的string一样)?经过自己的测试,推断,c++的方式不是写时复制,其在赋值的阶段就会开辟新的空间。

2024-05-14 21:40:48 667

原创 代码写法: 当对象作为参数进行传递的时候,应该以常引用或者引用的形式传递

如果函数中不去修改对象的属性或者不去调用对象的非const方法,我们就。在绝大多数的使用场景中都是这样的。

2024-05-14 10:47:25 108

原创 scanf_s

但是在读取字符串的时候,就需要多加一个参数,用来表示读取字符串的长度。-- 这样的目的是为了更加的安全,预防字符数组越界。scanf_s在读取非字符串的时候和scanf使用的方式是一样的。

2024-05-13 18:14:41 107

原创 unique_ptr和shared_ptr的选择

首先shared_ptr内部需要为引用计数开辟空间和相关操作,所以其相对unique_ptr而言开销更大。如果只是使用智能指针,不要求共享,那就优先使用unique_ptr。如果要求共享,那就使用sahred_ptr。

2024-05-10 16:42:44 107

原创 应该在栈空间创建对象还是在堆空间

在栈空间开辟空间相比在堆空间开辟效率是要高的。而且栈空间的内存是自动释放的。但是栈空间的空间很小,如果我们类占用的空间很大的时候,在栈开辟空间就不合理了。而且栈空间不能根据我们的需求来控制空间的开辟和释放。堆空间的空间很大。而且堆空间我们可以自己控制空间的开辟和释放。比栈空间效率低。而且容易忘记释放空间,造成内存泄露。

2024-05-08 15:54:54 203

原创 c++字符串和C语言的字符串返回的字符串长度都是字节数

无论是C语言的strlen(),还是c++的length(),size()返回的字符串长度都是字符串的字节数。"我爱你" :返回的长度为6,因为中文字符一般占2个字节。比如: "abcde" : 返回的长度为5。

2024-05-07 22:50:24 339

原创 常见错误: 创建const的对象的时候没有初始化内部数据

当我们使用默认的提供的空实现构造函数,或者构造函数中没有对属性初始化的时候,会出错,这时候我们应该自己实现构造函数,在构造函数内部对属性进行赋值,或者使用初始化列表,对属性进行初始化。我们知道创建const的对象,也就意味着我们内部的属性值不会被修改,也就是说和其他的const的变量一样,在创建const的对象的时候,其内部的属性应该进行初始化。这时候,创建const就不会出现问题了。

2024-05-07 22:48:20 78

原创 mutable -- 允许在const成员函数中修改成员属性的值

在实现类的过程中,我们经常将函数内部不去修改成员属性的函数设置为const,这样即安全,又可以给const的常量提供更多的函数可调用。我们知道const修饰的函数内部是不可以修改成员属性的,但是mutable关键字可以实现这样的功能。在想要在const函数中修改的成员属性前加上mutable,这样就可以在const函数中进行修改了。希望成员函数为const,但是又想要在此函数中修改某些特定的成员属性。mutable 译为: 可变。

2024-05-06 13:17:18 214

原创 c++11 的explicit关键字 -- 显示构建对象

explicit关键字就是为了解决隐式构建对象过程中带来的歧义,会容易让人理解为赋值语句,而不是调用构造函数。给相应的构造函数加上explicit关键字之后,我们就不能在使用=去调用构造函数了(隐式)。(普通构造函数或者拷贝构造函数都是)其实,拷贝构造函数即使使用=隐式构建,也并不会有太大歧义,当然也是根据自己的需求来定。

2024-04-30 15:21:00 870

原创 c++11新增静态数组 -- array

array是c++11新增的静态数组类型,数组我们平时使用的很多,那为什么在c++11增加一个array静态数组的类呢?array的提出可以完全代替我们平时使用的数组,而且其具有更高的安全性,而且使用array表示数组,我们不需要在使用sizeof计算数组的长度,或者在函数中传递一个数组的长度,直接调用array的size()方法就可以获取到数组大大小。

2024-04-29 18:15:52 389

原创 设置枚举的大小

我们如果只存储0-255个数,很明显我们只需要使用1个字节就足够存放这些数据了,所以就可以通过指定枚举类型的大小,来使其使用较小的空间,比如(unsigned char类型)。所以根据实际情况来定。无论是c++中新增的枚举类还是之前的枚举类型,我们都可以指定枚举类型的大小。在默认情况下,枚举类型是以32位整数来表示其数据的,

2024-04-25 20:00:22 249

原创 c++的智能指针(5) -- weak_ptr

就是我们的A,B类中都存在有指向对方的智能指针,当我们在main中定义指向类A和类B动态空间的智能指针的时候,同时,我们使用setPtr函数,将其内部的智能指针进行了赋值,分别指向了对方。也就是,我们不让类B中的智能指针指向类A的动态空间,这样类A的动态空间的引用计数就为1,在指向类A空间的智能指针pa释放的时候,引用计数减为0,这样类A的动态空间就会被释放。这时候,对于动态开辟的A类和B类的动态空间而言,都同时存在着两个智能指针管理(一个是main中定义的,一个是类中的成员),引用计数为2。

2024-04-22 16:17:27 1037

空空如也

空空如也

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

TA关注的人

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