CPP文件读写
记录C++文件读写操作
C++ 笔记
四区
全局区 静态变量、全局变量、常量 代码区 存储编写的代码,本质就是把代码编译形成的二进制文件放在内存的代码区
栈区 形参、临时变量(由操作系统负责分配与回收)
堆区 new的变量(由程序员负责分配与回收)
argc和argv如果在命令行中编译运行C或C++文件,可能会传入某些参数,argc为参数的个数,argv为每一个参数的名称 main(int argc, char *argv[]) argv[0]为运行文件的目录地址(第一个参数) argv[1]为传入的第二个参数 … argv[argc-1]为传入的argc个参数 argv[argc]为NULL 图片中hello即为传入的第二个参数
函数的分文件编写
把函数声明放在.h的头文件中
把函数定义写在.cpp的函数文件中
在main.cpp中包含了函数声明头文件即可直接使用此函数
123456789101112131415161718192021222324252627swap.h#include <iostream>using namespace std;void swap(int *a, int ...
每日一题-动态规划(从不同类型的物品中各挑选一个,使得最后花费总和等于1000)
四种类型的物品,每一种类型物品数量都是n,先要从每种类型的物品中挑选一件,使得最后花费总和等于1000 暴力做法10000^4 看到花费总和是1000,很小且固定的数字,肯定有玄机,从这里想应该是用dp,不难想到用dp[i][j]表示前i种类型的物品花费为j的方案数量,思考转移方程: dp[i][j] = dp[i-1][j-A] * js[i][A],js[i][A]表示i类型的物件花销为A的方案数量,如此只需要枚举j和A,它们的范围就是1000以内
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include <iostream>#include <vector>#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)using namespace std;int dp[5][1100], js[5][11000];int n;vector< ...
函数对象以及labbda表达式浅析
函数对象函数对象就是仿函数,之所以叫仿函数,是因为使用起来书写形式和调用函数的代码形式很像,之所以叫函数对象,是因为本shi质还是个对象,只不过写这个类是为了使用类似函数的功能。 仿函数就是重载了括号,例如以下代码
123456789101112131415161718192021#include <iostream>using namespace std;class myPrint{ public: int cnt; void operator()(int n) { cout << n << endl; ++ cnt; }}; int main(){ myPrint func; func(2);// myPrint()(2); return 0;}
myPrint类声明的对象就是函数对象,func()本质上是调用成员函数func.operator()(2),但是由于经过运算符重载后也可以写成func(2),形式就像是调用函数一样,所以称为函 ...
环境配置-转载的文章
1. opencv+qt+MinGW click here
2. CLion+opencv click here
快速排序-防止退化O(n2)(三路排序)
题目 click here
题解传统快速排序12345678910111213141516void quickSort(int a[], int l, int r) { if(l >= r) return ; int bas = a[l]; int i = l, j = r; while(i < j) { while(i < j && a[j] >= bas) j --; a[i] = a[j]; while(i < j && a[i] <= bas) i ++; a[j] = a[i]; } a[i] = bas; quickSort(a, l, i-1); quickSort(a, i+1, r);}
Hack数据1严格单调有序的数组 时间复杂度会退化为O(n2) 解决方案:随机化数组或者随机取基准值(而非第一个)
12int id = l + rand() % (r - l + 1);int bas = a[id];
Hack数据2所有数据都相等的数组 ...
select、poll、epoll(IO多路复用)
功能三个模型都是用来判断是否有被监听的socket状态发生改变(读写和异常)
select首先介绍一下fd_set这个数组,这其实是一个类图,其中每一位表示一个socketfd,哪一位是1表示这一位对应的socket就是被监听的,有三种需要监听的状态,所以就有三个数组,分别是readset,writeset、exceptset,分别监听读写和异常 select原型:
12int select(int maxfd, fd_set* readset, fd_set* writeset, fd_set* exceptset, const struct timeval* timeout);>
maxfd表示监听的最大fd(给定了范围)
三种状态的数组
timeout表示超时时间,当timeout是NULL表示select只有监听到状态发生变化才会结束否则被阻塞,timeout是0表示select非阻塞,立刻返回,timeout>0(数据结构内部有int)表示过一定时间后若还未检测到状态变化就结束
返回值为状态变化的fd数量,若返回-1表示错误
原理select采用轮询的方 ...
高并发浅析
什么是高并发高并发指通过设计保证系统能够同时并行处理很多请求,是分布式系统非常重要的概念 评价分布式系统性能的指标有:
响应时间:系统对请求做出响应的时间。
吞吐量:单位时间内处理的请求数量。
QPS(和吞吐量基本没啥区别):每秒响应请求数。
并发用户数:同时承载正常使用系统功能的用户数量。
水平扩容和垂直扩容那么如何实现高并发呢? 上图都是实现高并发的方法,而这里只介绍水平扩容和垂直扩容
垂直扩容这是过去一直在使用并且可以马上见效的方法,但是缺点也很致命,垂直扩容有两种方案
提升单机硬件配置 例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G; 改善单机架构 例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间; 但是这种方式势必会受到科技的限制,性能有极限,如果想突破这种极限,实现线性上升,就需要水平扩容
水平扩容增加服务器数量,把请求尽量均匀地分配到各个服务器上,这也是分布式系统的目标。 举个例子,通常一个域名绑定一个IP,而一个IP对应一个服务器,当 ...
红黑树介绍
红黑树就是满足以下特性的二叉树
所有节点只有红色和黑色
红色节点的孩子都是黑色(红色节点不能相邻)
黑色节点到任意叶子节点的简单路径上经过的黑色节点数量相同
叶子节点不存储值,而且叶子节点都是黑色的 满足这样特性的二叉树高度一定不超过2log(n+1) 下面是证明 如果把红色节点全部删掉,把下面的剩下的所有节点都连接在一起,那么新产生的树就是一颗每个节点最多有四个子节点的树,计算高度可以采用满四叉树的高度来近似计算,即log(n),而把删除的红色节点加上就是2倍
红黑树相较于AVL,其查找效率略低一点,而插入删除效率高出AVL很多,所以当插入删除操作很多时可以使用红黑树
Qt 桌面闹钟提示小程序
程序运行截图倒计时 闹钟设置界面 闹钟弹窗提示+提示音
源码 gitee源码链接 软件打包