自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Qt中鼠标点击的几种状态

对于可切换的按钮,选中状态可以通过用户的点击操作或者通过编程方式进行切换。这些事件与按钮的状态有关。信号既可以由用户的交互触发,也可以通过编程方式触发。在Qt中,鼠标点击按钮通常会触发一系列的事件,包括。事件:当用户按下鼠标左键时触发。事件:当用户释放鼠标左键时触发。事件:在按钮被按下并释放时触发。,主要用于可切换的按钮,例如复选框(以下是一个简单的示例,演示了如何使用。函数:模拟按钮点击。

2023-12-25 19:27:09 2470

原创 第四章-状态码

具体而言,当客户端请求一个资源,并且该资源在服务器上自客户端上次请求之后没有发生变化时,服务器可以返回 304 状态码,告知客户端可以继续使用它在缓存中保存的版本,而不用重新传输整个资源。比如,使用GET 方法时,对应请求资源的实体会作为响应返回:而使用HEAD方法时,对应请求资源的实体首部不随报文主体作为响应返回(即在响应中只返回首部,不会返回实体的主体部分)。另外,也不允许返回任何实体的主体。这里的关键是客户端收到 307 响应后,会继续使用原始请求的方法和请求体,将请求发送到新的 URI。

2023-12-25 17:13:30 1307

原创 makefile进阶版

用户可以定义自己的变量,称为用户自定义变量。makefile 中的变量是没有类型的直接创建变量然后给其赋值就可以了。# 错误, 只创建了变量名, 没有赋值变量名# 正确, 创建一个变量名并且给其赋值变量名=变量值取出变量的值# 如果将变量的值取出?$(变量的名字)# 举例 add.o div.o main.o mult.o sub.o# 定义变量并赋值# 取变量的值$(obj)自定义变量使用举例# 这是一个规则,普通写法# 这是一个规则,里边使用了自定义变量。

2023-12-25 10:19:31 1070

原创 makefile基础版

使用 GCC 的命令行进行程序编译在单个文件下是比较方便的,当工程中的文件逐渐增多,甚至变得十分庞大的时候,使用 GCC 命令编译就会变得力不从心。这种情况下我们需要借助项目构造工具 make 帮助我们完成这个艰巨的任务。,一般来说,大多数的IDE都有这个命令,比如:Visual C++的nmake,QtCreator的qmake等。make工具在构造项目的时候需要加载一个叫做makefile的文件,makefile关系到了整个工程的编译规则。

2023-12-24 17:31:44 912

原创 c++原子变量

​ C++11提供了一个原子类型std::atomic<T>,通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定bool、char、int、long、指针等类型作为模板参数(不支持浮点类型和复合类型)。​原子指的是一系列不可被CPU上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核CPU下,当某个CPU核心开始运行原子操作时,会先暂停其它CPU内核对内存的操作,以保证原子操作不会被其它CPU内核所干扰。​。

2023-12-14 11:08:45 3111

原创 c++线程同步之条件变量

wait_until()函数和wait_for()的功能是一样的,它是指定让线程阻塞到某一个时间点,假设阻塞的线程没有被其他线程唤醒,当到达指定的时间点之后,线程就会自动解除阻塞,继续向下执行。wait_for()函数和wait()的功能是一样的,只不过多了一个阻塞时长,假设阻塞的线程没有被其他线程唤醒,当阻塞时长用完之后,线程就会自动解除阻塞,继续向下执行。)的功能是一样的,只不过多了一个阻塞时长,假设阻塞的线程没有被其他线程唤醒,当阻塞时长用完之后,线程就会自动解除阻塞,继续向下执行。

2023-12-13 11:13:38 1125

原创 c++互斥锁

这是因为线程在运行的时候需要先得到CPU时间片,时间片用完之后需要放弃已获得的CPU资源,就这样线程频繁地在就绪态和运行态之间切换,更复杂一点还可以在就绪态、运行态、挂起态之间切换,这样就会导致线程的执行顺序并不是有序的,而是随机的混乱的,就如同下图中的这个例子一样,理想很丰满现实却很残酷。​ 在上面的例子中,通过一个while循环不停的去获取超时互斥锁的所有权,如果得不到就阻塞1秒钟,1秒之后如果还是得不到阻塞50毫秒,然后再次继续尝试,直到获得互斥锁的所有权,跳出循环体。

2023-12-12 16:07:21 1287

原创 call_once

比如:要初始化某个对象,而这个对象只能被初始化一次,就可以使用std::call_once()来保证函数在多线程环境下只能被调用一次。通过输出的结果可以看到,虽然运行的三个线程中都执行了任务函数do_something()但是call_once()中指定的回调函数只被执行了一次,我们的目的也达到了。是 C++ 标准库提供的一个函数,用于保证一个函数只会被调用一次,即使在多线程环境下也能确保线程安全。主要用于执行只需要执行一次的初始化操作。

2023-12-11 20:38:11 1210

原创 命名空间this_thread

命名空间this_thread中提供了一个非常绅士的函数yield(),在线程中调用这个函数之后,处于运行态的线程会主动让出自己已经抢到的CPU时间片,最终变为就绪态,这样其它的线程就有更大的概率能够抢到CPU时间片了。在C++11中不仅添加了线程类,还添加了一个关于线程的命名空间std::this_thread,在这个命名空间中提供了四个公共的成员函数,通过这些成员函数就可以对当前线程进行相关的操作了。为了能够实现并发处理,多个线程都是分时复用CPU时间片,快速的交替处理各个线程中的任务。

2023-12-11 16:58:04 650

原创 IO部分笔记

IO: 存储和读取数据的解决方案作用:用于读写文件中的数据(可以读写文件, 或网络中的数据)底层就是字节流(加上了字符集)输入流:一次读一个字节, 遇到中文时, 一次读多个字节输出流: 底层会把数据按照指定的编码方式进行编码, 变成字节在写到文件中使用场景对于纯文本文件进行操作1.缓冲流有几种?字节缓冲输入流: BufferedInputStream字节缓冲输出流: BufferedOutputStream字符缓冲输入流: BufferedReader。

2023-12-11 16:16:27 577

原创 c++线程类的使用

C++11之前,C++语言没有对并发编程提供语言级别的支持,这使得我们在编写可移植的并发程序时,存在诸多的不便。现在C++11中增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高。C++11中提供的线程类叫做std::thread,基于这个类创建一个新的线程非常的简单,只需要提供线程函数或者函数对象即可,并且可以同时指定线程函数的参数。

2023-12-07 16:04:43 987

原创 Chrono库

C++11中提供了日期和时间相关的库chrono,通过chrono库可以很方便地处理日期和时间,为程序的开发提供了便利。chrono库主要包含三种类型的类:时间间隔duration、时钟clocks、时间点time point。duration表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下:Rep:这是一个数值类型,用来表示时间段所经历的滴答(tick)数。若 Rep 是浮点数,则 duration 能使用小数描述时钟周期的数目。Period:

2023-12-06 15:53:11 1083

原创 弱引用能指针 weak_ptr

弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手,它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的主要作用就是作为一个旁观者监视shared_ptr中管理的资源是否存在。

2023-12-05 16:48:02 582

原创 独占智能指针unique_ptr

头文件:#include智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型。

2023-12-04 19:59:34 1125

原创 共享智能指针shared_ptr

如果申请的内存是普通类型,通过函数的()可完成地址的初始化,如果要创建一个类对象,函数的()内部需要指定构造对象需要的参数,也就是类构造函数的参数。另外,我们在初始化智能指针的时候也可以自己指定删除动作,这个删除操作对应的函数被称之为删除器,这个删除器函数本质是一个回调函数,我们只需要进行实现,其调用是由智能指针完成的。在上面的代码中,lambda表达式的参数就是智能指针管理的内存的地址,有了这个地址之后函数体内部就可以完成删除操作了。是最后一个拥有某个对象的智能指针,它会调用对象的析构函数来释放资源。

2023-12-03 22:06:19 1136

原创 联合体union

掌握了**的使用,我们通过一段程序来演示一下class Basepublic:private:Student()int id;Base tmp;s.name = "蒙奇·D·路飞";s.tmp.setText("我是要成为海贼王的男人!");return 0;Base notes: 我是要成为海贼王的男人!Student name: 我是要成为海贼王的男人!

2023-12-01 16:46:07 1681

原创 File类

File: 路径IO流: 传输。

2023-11-30 20:41:50 483

原创 枚举和枚举类

错误的原因上面也提到了,在这两个具名的枚举中Dongjing是全局可见的,所有编译器就会提示其重定义了。另外,由于C中枚举被设计为常量数值的”别名”的本性,所以枚举的成员总是可以被隐式地转换为整型,但是很多时候我们并不想这样。

2023-11-30 11:05:48 1148

原创 常见算法和Lambda表达式

前提条件: 数组中的数据必须有序核心逻辑: 每次排除一半的查找范围else{return -1;总结1.二分查找的优势?提前查找效率2.二分查找的前提条件?数据必须是有序的如果数据是乱的,先排席再用二分查找得到的索引没有实际意义,只能确定当前数字在数组中是否存在,因为排序之后数字的位置就可能发生变化了3.二分查找的过程min和max表示当前要查找的范围mid是在min和max中间的。

2023-11-30 10:13:15 930

原创 扩展的friend语法

friend关键字在C++中是一个比较特别的存在。因为在大多数编程语言中是没有提供friend关键字的,比如Java。friend关键字用于声明类的友元,友元可以无视类中成员的属性( public、protected 或是 private )友元类或友元函数都可以访问,这就完全破坏了面向对象编程中封装性的概念。但有的时候,friend关键字确实会让程序猿少写很多代码,因此 friend 还是在很多程序中被使用到。友元提供了一种机制,允许某个类或函数在需要时访问另一个类的私有部分。

2023-11-29 16:46:43 1007

原创 c++11新特性篇- =default 和 = delete

/ 'a' 对应的 acscii 值为97// errorb.print();第5行:禁用带 char类型参数的构造函数,防止隐式类型转换(char转int)第6行:禁止使用带char类型的自定义函数,防止隐式类型转换(char转int)第22行:对应的构造函数被禁用,因此无法使用该构造函数构造对象。

2023-11-28 15:18:48 2486

原创 什么是POD类型

在现代C++中,更推荐使用这样的类型特性检查工具,而不是手动检查是否为POD类型。这些工具更准确,同时也更易读。float y;这里,将在编译时检查MyPODType是否为 trivial 和 standard layout 类型。单独使用的话, 返回值是布尔类型class A {};

2023-11-27 15:42:15 1709

原创 c++11新特性篇-可调用对象包装器, 绑定器

std::bind绑定器返回的是一个仿函数类型,得到的返回值可以直接赋值给一个std::function,在使用的时候我们并不需要关心绑定器的返回值类型,使用auto进行自动类型推导就可以了。示例程序中是使用function包装器保存了bind返回的仿函数,如果不知道包装器的模板类型如何指定,可以直接使用auto进行类型的自动推导,这样使用起来会更容易一些。在上面的程序中,使用了std::bind绑定器,在函数外部通过绑定不同的函数,控制了最后执行的结果。: 常规的函数,包括全局函数和类的成员函数。

2023-11-24 10:41:39 1903

原创 c++11新特性篇-using的使用

在 C++11 之前就有,但在 C++11 中引入了一些扩展和新的用法。在 C++中可以通过 typedef 重定义一个类型,语法格式如下:被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。再看一个复杂点的例子:上面两行代码将 定义为 的别名,所以后续使用 就相当于使用 。将 定义为 的别名,而 定义为 的别名,即指向 (也就是 )类型的指针。综合起来就是:using在使用的时候,关键字using作为别名声明的开始,其后紧跟别名和等号,其作用是把等号左侧的名字规定成

2023-11-23 18:27:05 896

原创 c++11新特性篇-列表初始化

列表初始化是 C++11 引入的一个新特性。**它允许使用花括号{}来初始化变量、数组、结构体等。**列表初始化具有更加统一和直观的语法,同时也提供了一些优势,例如防止窄化转换(narrowing conversion)等。int x{42};// 初始化整数变量 x 为 42// 初始化整数数组 arr 为 {1, 2, 3}int x;int y;// 初始化结构体 Point 的对象 p 的成员 x 和 y// 初始化整数向量 vec 为 {1, 2, 3}

2023-11-22 14:29:09 417

原创 移动语义和完美转发

完美转发是 C++11 引入的一个重要特性,它允许在模板中精确地保持函数参数的值类别(左值还是右值),并将它们传递到其他函数。完美转发通常用于实现泛型代码,特别是在编写通用函数模板时非常有用。完美转发的核心在于使用通用引用(Universal Reference)和引用折叠。通用引用的语法是T&&,其中T是模板参数。引用折叠是指在模板类型推导或类型声明的过程中,两个引用(无论是左值引用还是右值引用)可能折叠成一个引用。// 用于演示的一个简单处理函数// 完美转发函数模板。

2023-11-20 15:17:42 323

原创 Java进阶笔记(面向对象后, 持续更新)

分组就是个小括号每组是有组号的, 也就是序号规则1: 从1开始, 连续不间断规则2: 以左括号为基准, 最左边的是第一组, 其次为第二组, 以此类推Calendar代表了系统当前时间的日历对象, 可以单独修改, 获取事件中的年月日细节: Calendar是一个抽象类, 不能直接创建对象。

2023-11-17 11:08:33 481 1

原创 c++11新特性篇-右值引用

由于上述代码中**存在T&&或者auto&&这种未定引用类型,当它作为参数时,有可能被一个右值引用初始化,也有可能被一个左值引用初始化,在进行类型推导时右值引用类型(&&)会发生变化,这种变化被称为引用折叠。a=b是一种特殊情况,在这个表达式中a, b都是左值,因为变量b是可以被取地址的,不能视为右值。在C++中在进行对象赋值操作的时候,很多情况下会发生对象之间的深拷贝,如果堆内存很大,这个拷贝的代价也就非常大,在某些情况下,如果想要避免对象的深拷贝,就可以使用右值引用进行性能的优化。

2023-11-16 20:11:59 419

原创 什么是线段树?

线段树(Segment Tree)是一种二叉树数据结构,通常用于解决与区间或者段相关的问题。它主要用于处理一维区间的查询和更新操作,例如,查找区间内的最小值、最大值、和、平均值等。线段树是一种灵活而强大的数据结构,特别适用于需要频繁查询和更新区间信息的场景。线段树的基本思想是将一个区间划分成多个子区间,每个节点表示一个子区间的信息,然后递归地构建这个二叉树。通常情况下,线段树是一颗平衡二叉树,每个叶子节点表示数组中的一个元素,而每个非叶子节点表示对应区间的一些信息,如最小值、最大值、和等。

2023-11-15 14:24:08 281

原创 Floyd算法

Floyd算法,也称为Floyd-Warshall算法,是一种用于解决图中所有节点对之间最短路径的动态规划算法。该算法的目标是找到图中每一对节点之间的最短路径,考虑图中的权重(边上的权值)。算法的核心思想是通过一个中间节点的集合,逐步优化节点对之间的最短路径。具体来说,Floyd算法使用一个二维数组来存储任意两个节点之间的最短路径长度,然后通过逐步考虑图中所有节点作为中间节点的情况,不断更新最短路径的信息。初始化一个二维数组,其中元素(i, j)表示节点i到节点j的最短路径长度。

2023-11-14 09:25:00 261

原创 c++11新特性篇-委托构造函数和继承构造函数

C++11引入了委托构造函数(Delegating Constructor)和C++11及后续标准引入了继承构造函数(Inheriting Constructor)两个特性。

2023-11-13 17:19:56 1169

原创 c++11新特性篇-constexpr

常量表达式函数(constexprfunctions)是指在编译时就能够被计算的函数。在C++11引入了constexpr关键字后,程序员可以声明函数为常量表达式函数,以便在编译时执行,而不是在运行时。这提供了一些性能优势,因为编译时计算可以避免在运行时进行一些重复的计算。constexprconstexpr函数的参数和返回值必须是可以在编译时计算的类型,这通常包括整数、指针等。在调用constexpr函数时,如果传入的参数是常量表达式,那么函数的执行将在编译时完成,结果会被直接嵌入到生成的机器代码中。

2023-11-10 20:44:12 252

原创 c++11新特性篇-lambda表达式

Lambda 表达式是C++11引入的新特性。Lambda 表达式允许你在代码中创建匿名函数(或闭包),而不需要单独定义函数。它提供了一种更简洁和方便的方式来编写可调用对象,并且可以捕获外部变量,使得在函数对象中可以使用外部作用域的变量。

2023-11-09 20:20:21 184

原创 设计模式-适配器模式(Java实现)

适配器将AmericanSocket的getAmericanVoltage()方法转换为Voltage接口的getVoltage()方法,使得客户端代码可以通过Voltage接口调用AmericanSocket的方法。适配器模式通常用于使得原本不兼容的接口能够协同工作。也就是说,我现在有一个接口,还有一个类跟这个接口无法直接实现,就需要一个中间类,这个中间类adapter要实现这个接口,并重写接口中的方法;此外这个中间类需要把想实现接口的类作为内部对象,这样就可以在重写的方法中将之前的类和接口联系起来。

2023-11-07 16:59:44 192

原创 c++11新特性篇-nullptr

C++11 引入了 nullptr 关键字,它是一种空指针常量,用于表示空指针。nullptr 具有明确的类型,可以被赋值给任意指针类型,而不会引发类型转换的歧义。使用 nullptr 可以提高代码的清晰度,避免了与整数零的混淆。这里不写具体的例子了,nullptr还是挺常用的。主要介绍下跟NULL的区别。

2023-11-07 10:47:14 271

原创 空指针和野指针

在C和C++中,可以将指针初始化为NULL(在C中)或nullptr(在C++中),以表示它是一个空指针。例如:

2023-11-06 17:11:21 247

原创 c++11新特性篇-基于范围的for循环

基于范围的 for 循环(Range-based for loop)是C++11引入的新特性。这种循环形式使得遍历容器(如数组、向量、列表等)中的元素变得更加简洁和直观。在C++11之前,我们通常使用传统的 for 循环或迭代器来遍历容器中的元素。其中,container 是一个容器(如数组、向量、列表等),element 是容器中的每个元素。auto 关键字用于自动推导容器中的元素类型。这种循环会遍历容器中的每个元素,将元素赋值给 element,然后执行循环体内的操作。

2023-11-06 16:50:31 642

原创 c++11新特性篇-自动类型推导(auto, decltype)

auto 是C++11引入的关键字,用于进行自动类型推导。使用 auto 可以在变量声明时省略类型,让编译器根据初始化表达式自动推导变量的类型。这使得代码更加简洁、可读性更高,并且在使用范围较大的情况下,可以提高代码的可维护性。

2023-11-03 20:31:32 821

原创 c++11新特性篇-noexcept

在上篇文章介绍what() 函数的时候提了一下:在介绍noexcept之前,这里先讲一下throw关键字,也就是异常接口声明。

2023-10-31 19:23:30 256

原创 黑马程序员-JAVA笔记(从面向对象进阶开始)持续更新

Java黑马提高篇笔记。

2023-10-30 22:29:32 1799

空空如也

空空如也

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

TA关注的人

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