- 博客(180)
- 收藏
- 关注
原创 OpenGL中EBO的使用及原理
在OpenGL中,EBO(Element Buffer Object),也称为索引缓冲对象 IBO(Index Buffer Object),是一种用于存储顶点索引数据的缓冲区对象。它的核心作用是通过复用顶点数据来减少重复顶点的存储和传输,从而优化渲染性能。
2025-04-01 20:29:40
166
原创 GLSL(OpenGL 着色器语言)基础语法
✅GLSL语法类似 语言,但更适合GPU并行计算。✅顶点着色器主要进行坐标变换。✅片元着色器主要计算像素颜色。✅变量修饰符 in、out、uniform 控制数据流。✅向量、矩阵 计算是GLSL 的核心,优化GPU性能。
2025-03-30 21:40:36
672
原创 QOpenGLWidget的使用:绘制三角形
所有 OpenGL 资源(VBO、VAO、Shader)都是 先创建 → 再绑定 → 配置 → 解绑 → 使用时重新绑定 → 释放,大致流程如下:首先要了解,VAO(顶点数组对象)和 VBO(顶点缓冲对象)是 OpenGL 里用于管理顶点数据的两种不同对象。简单来说:VBO(Vertex Buffer Object) : 是一个 GPU 缓冲区,存储顶点数据(如坐标、颜色、法线等)。如果只 bind() 了 VBO,OpenGL 还不知道数据怎么解析。
2025-03-30 18:12:32
518
原创 快速排序(C++实现)
通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字都比两一部分记录的关键字小,则可对这两部分记录进行排序,以达到整个序列有序。对各子表重新选择中心元素并。的元素一律前放,比他。的元素一律后放,形成。,直到每个子表的元素。
2024-11-28 22:33:02
332
原创 单例模式4种实现方式C++
假设在reorder的情况下:线程1走到赋值,但还没调用构造的阶段,而线程2进来判断m_instance,此时它已经被复制 所以不为空,这时候线程2就直接返回m_instance,但事实上它还没构造出来……因为编译器优化,指令的执行顺序可能reorder(CPU执行指令的层次,而且线程是在指令层次抢时间片的) ,可能变成这样:分配内存->赋值->调用构造(理想应该是:分配内存->调用构造->赋值)这样,编译时在编译的时候就知道,这个变量的整个赋值过程不能reorder,需要按照常规的流程走。...
2022-08-21 11:41:39
1178
原创 navicat远程连接不了阿里云服务器上的mysql
第一步:在阿里云服务器中开放3306端口第二步:修改配置,bind-address改为0.0.0.0第三步:登录mysql修改系统表user最后添加远程访问权限use mysql;Grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;flush privileges;还不行,重启一下mysql服务:service mysql restart...
2022-05-29 17:45:43
926
原创 Sqlite的rowid
sqlite3的每个表都有一个隐藏列:rowid,是一个64位的整数select rowid from table如果你在表中设置了主键(integer类型),此时,主键即rowid(也可以叫索引)使用rowid查询一般速度都会比较快rowid的一些规则:(1)从1开始,自增长的(2)在取值范围内,每次都比记录的最大rowid + 1(3)超出范围,随即在之前删除的rowid中选取一个使用场景:假设表中有一个主键列,执行insert语句时,想使用rowid(和rowid的规则)作为主键使用
2022-05-17 22:40:48
2683
原创 QList原理
QList不同于std::list,QList根据容易元素类型的不同,采用不同的数据结构来处理,从而节省内存、提高效率。QList的模板参数T大概分为两种情况:(1)如果T占用的内存较多 或 T占用内存少但有构造函数QList将每个元素存放在堆上,再维护一个指针数组,指向这些元素。所以可以根据索引快速查找元素,但删除操作速度较慢。(2)如果T是一个指针类型 或 T所占字节数小于指针所占字节数QList将T直接存放在指针数组中...
2022-04-10 16:17:25
834
原创 c++11 智能指针shared_ptr、weak_ptr
1、概述shared_ptr:强智能指针,可以改变资源的引用计数weak_ptr:弱智能指针,不会改变资源的引用计数2、问题强智能指针相互循环引用问题,会导致内存泄漏,如下:解决方法定义对象的时候使用强智能指针,在引用对象的地方使用弱智能指针...
2022-03-13 22:36:43
3419
原创 c++11 lambda表达式底层
lambda表达式也叫匿名函数或闭包,如果这个函数只使用不频繁,或者是不想起名,可以使用匿名函数。lambda式可以临时制作出回调函数、接口适配函数或语境相关函数的特化版本以供一次性使用。// 闭包可以复制 auto fun = [ capture_list ](parameter_list) -> return type {
2022-03-13 16:57:48
1980
5
原创 Qt事件处理机制
1.Qt事件简述Qt的事件主要分为两种:操作系统产生Qt应用程序产生首先,所有的Qt事件均继承抽象类QEvent,其描述程序内部或外部发生的动作。任意的QObject对象都具备处理Qt事件的能力。在发生事件时,会产生一个QEvent对象,这个对象会传递给当前组件的event( )函数。如果当前组件没有安装事件过滤器,则会将QEvent对象发放到相应的xxxEvent( )函数中。不同的QEvent对象会有各种各样的属性,比如:鼠标按下的属性So,总体的流程如下:Qt的main() 函数
2022-02-20 21:25:57
2023
原创 SQL基础知识笔记整理
一、检索数据select1.检索单个列2.检索多个列3.检索所有列4.检索不同的行:select distinct 字段1 from 表名select distinct 字段1,字段1,字段1 from 表名select distinct * from (错误)5.限制结果:select * from 表名 limit 5 #返回不多于5行select * from 表名 limit 5,3 #返回从行5开始的3行(行索引从0开始)6.完全限定的表名二、排序检索数据orde
2021-09-28 00:15:21
1205
原创 Qt设置文本省略样式
void ZqyFunctionConfigWdt::setLabelElidedText(){ QString text = ui->label->text(); QFontMetrics metricsLabel(ui->label->font());//比较文本的长度和控件的长度,如果文本长度大于控件的长度 if(metricsLabel.width(text) > ui->label->width()) { //
2021-07-30 22:18:32
631
原创 Qt动态样式
如果想要一个控件在不同的情况下使用不同的样式,一般直接setProperty是没有效果的。需要在setProperty后再加上unpolish和polish刷新一下,顺序不能反。ui->label->setProperty("lbStyle", "red");ui->label->style()->unpolish(ui->label);//删除旧样式ui->label->style()->polish(ui->label);//设置新样式
2021-07-30 22:13:02
563
原创 Qt中QTimeEdit、QDateEdit、QDateTimeEdit样式表
1.1 QTimeEdit 样式表效果图:qss代码:.QTimeEdit[timeEditStyle="commom"]{ min-height:24px; max-height:24px; border-radius:2px; border:1px solid #cccccc;}.QTimeEdit[timeEditStyle="commom"]:hover,.QTimeEdit[timeEditStyle="commom"]:focus{
2021-07-30 22:04:24
7902
1
原创 力扣136.只出现一次的数(异或运算)
异或是一种逻辑运算,相同为0,不同为1。在C++语言中,使用 ^ 符号表示异或运算符。异或运算的时候只能使用二进制位运算,所以需要先将十进制位转换成二进制位。力扣136 只出现一次的数给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?方法1、暴力法(时间复杂度O(n^2))方法2、哈希法(时间、空间复杂度均为O(n))方法3、排序法(时间复杂度O(nlg(n)))方法
2021-07-26 22:03:19
238
原创 Qt setMouseTracking函数的作用
设置窗体是否追踪鼠标this->setMouseTracking(true);//默认值为false该函数默认是不追踪的,不追踪的情况下 : 至少有一个鼠标按键按下才会响应鼠标移动事件。那么如果你在鼠标悬停的时候就想响应鼠标事件(获取鼠标位置信息等)的话,就需要将函数设为true。...
2021-07-24 17:05:36
681
原创 TCP协议
面试常见问题怎么确保可靠性?停止等待协议和连续ARQ协议流量控制拥塞控制的方法?为什么要三次握手,而不是两次握手?为什么要四次挥手?为什么是2MSL?TCP特点TCP是面向连接的传输控制层协议。因为应用程序在使用TCP协议之前,必须先建立TCP连接;在传输数据完成后,必须释放已经建立的连接。TCP连接是点对点的。TCP提供可靠交付的服务。通过TCP连接传输的数据,无差错、不丢失、不重复,并且按序到达。TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TC
2021-03-31 21:36:43
1490
原创 三步问题(C++)
题目描述三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。代码实现解法1//时间复杂度o(n) 空间复杂度o(n)class Solution {public: int waysToStep(int n) { vector<int> dp(n+1,0); if(n<3) return n;
2021-03-28 20:07:54
536
原创 746 使用最小花费爬楼梯(C++)
题目描述数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。思路只要在当前位置的前两个中选择一个最小值+当前位置的值,就是每个阶梯所花费的最小值代码实现class Solution {public: int minCostClim
2021-03-28 19:19:11
303
原创 青蛙跳台阶的问题(C++)
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。思路首先定义一个数组记录那些需要重复计算的值然后找出数组之间的关系式找出初始条件代码实现int numWays(int n){ if(n<=1) return n; int dp[n+1]; // 定义一个数组记录重复使用的数据 dp[
2021-03-27 17:39:00
742
原创 按二进制数中1的个数分类
题目描述:小A刚学了二进制,他十分激动。为了确定他的确掌握了二进制,你给他出了这样一道题目:给定N个非负整数,将这N个数字按照二进制下1的个数分类,二进制下1的个数相同的数字属于同一类。求最后一共有几类数字?要求输入例子:158 2 5 7 3输出例子:3代码实现#include<iostream>#include<vector>#include<set>#include <algorithm>using namespace std
2021-03-27 17:37:18
121
原创 希尔排序(C++)
希尔排序是插入排序的一种高级变形,当数组元素较少并且基本有序的时候,使用直接插入排序效率很高,因为数组基本有序的时候,只需要执行少量的插入操作就行了。算法思想先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成),分别进行直接插入排序然后依次缩减增量再进行排序待整个序列中的元素基本有序(增量足够小时),再对全体元素进行一次直接插入排序。代码实现#include <iostream>using namespace std;void shell_sort(int
2021-03-25 18:47:35
410
2
原创 归并排序(C++)
#include <iostream>using namespace std;void merge(int *arr, int start, int middle, int end){ int i, j, k;//i指向左边的数组,j指向右边的数组,k指向原来的数组 int leftSize = middle+1-start; int rightSize = end-middle; //开辟新的内存存放左右两个数组 int *left = (int *)malloc(lef
2021-03-25 13:26:09
217
原创 堆排序(C++)
堆排序是一种选择排序,利用堆这种数据结构来完成选择。算法思想首先将一个(有序)数组构造成一个最大堆(降序)/最小堆(升序)然后将堆顶元素与最后一个元素交换位置,此时末尾元素就是最大值(或最小值)然后将剩余的n-1个元素重新构造成最大堆(或最小堆)所以,堆排序算法大概就分为两个步骤:构造堆(调整数组,使其满足最大堆或最小堆)排序构建堆首先,构造最大堆(以降序为例)就有两种方法,其中下沉操作建堆效率更高。下沉操作建堆:找到最后一个非叶子节点( i=(len-1)/2 ),从后往前遍
2021-03-24 17:48:29
833
1
原创 C++ unique_ptr笔记
转载于unique_ptrC++11引入了unique_ptr智能指针,主要用于替代不安全的auto_ptr。因此 C++11 标准中的 unique_ptr 模板类没有提供拷贝构造函数,只提供了移动构造函数。std::unique_ptr<int> p1(new int);std::unique_ptr<int> p2(p1);//错误,堆内存不共享std::unique_ptr<int> p2(std::move(p1));//正确,调用移动构造函数对于
2021-03-19 15:21:00
124
原创 C++ auto_ptr笔记
auto_ptr C++11已弃用编译阶段显示没问题运行阶段会报错简单分析对比一下,执行26行代码之后,智能指针baoma此时已经为空指针,再执行第27行代码肯定会报错(引用非法内存的指针)。这是因为auto_ptr要求其对“裸”指针(这里指car)的完全占有性。也就是说一个”裸“指针不能同时被两个以上的auto_ptr所拥有。那么,在拷贝构造或赋值操作时,我们必须作特殊的处理来保证这个特性。auto_ptr的做法是“所有权转移”,即拷贝或赋值的源对象(这里指baoma)将失去对
2021-03-19 14:51:48
152
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人