- 博客(39)
- 收藏
- 关注
原创 IDEA报错 找不到org.springframework.boot.SpringApplication
勾选Delegate IDE build/run actions to Maven。
2023-03-26 20:16:01 707
原创 2021-12-20 C++函数中的省略号
最近读程序遇到函数中有省略号的情况,比如:extern int showmsg(char *format, ...){...}C++允许定义形参个数和类型不确定的函数。例如,C语言中的标准函数printf便使用这种机制。在声明不确定形参的函数时,形参部分可以使用省略号“…”代替。“…”告诉编译器,在函数调用时不检查形参类型是否与实参类型相同,也不检查参数个数。在上面的代码中,编译器只检查第一个参数是否为整型,而不对其他参数进行检查。...
2021-12-20 14:12:25 915
原创 2021-12-19 C语言函数集
#include<string.h>strcmp(s1,s2);//s1==s2返回0,<返回负数,>返回正数。
2021-12-17 13:36:05 792
原创 12-16 main函数的参数
main函数作为C/C++语言程序的入口,可以在()内带参数,也可以不带。如果需要main函数中输入参数,格式应为: int main(int argc, char* argv[]) 或者 int main(int argc, char** argv)其中第一个参数为int型,第二个参数为char **型。argc即argument count,即参数的个数。argv表示argument vector,即参数数组。表示传入main函数的指针数组,为char**类型。第一个数组元素argv[0]是程
2021-12-17 13:30:55 162
原创 2021-11-12 牛客TOP100 寻找第K大
题目概述:描述有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。要求:时间复杂度 O(nlogn)O(nlogn)O(nlogn),空间复杂度 O(1)O(1)O(1)数据范围:0≤n≤10000\le n \le 10000≤n≤1000, 1≤K≤n1 \le K \le n1≤K≤n,数组中每个元素满足 0≤val≤100000000 \le val \l
2021-11-12 15:24:18 131
原创 2021-11-4 数据库基础知识
1、数据库四大特性:原子性,一致性,隔离性,持久性。原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。一致性(Consistency)事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。隔离性(Isolation)隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,
2021-11-04 13:58:26 93
原创 2021-11-04 设计模式
1、单例模式这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
2021-11-04 13:07:20 77
原创 2021-11-4 进程间通信方式
1、匿名管道管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。// 需要的头文件#include <unistd.h>// 通过pipe()函数来创建匿名管道// 返回值:成功返回0,失败返回-1// fd参数返回两个文件描述符// fd[0]指向管道的读端,fd[1]指向管道的写端// fd[1]的输出是fd[0]的输入。int pipe (int fd[2]);2、有名管道有名管道也是半双工的通信方
2021-11-04 11:13:55 96
原创 2021-11-4 socket的通信过程
客户端:首先创建socket套接字,然后调用connect()建立连接。进行TCP三次握手后,使用write()写数据,read()读取数据,最后close()关闭连接。服务端:服务端首先创建套接字socket(),然后bind()绑定相应的地址和端口号,并置于监听状态。然后调用accept(),阻塞等待客户端发起连接。建立连接后,使用write()写数据,read()读数据,最后close()关闭连接。TCP三次握手过程:服务器调用socket()、bind()、listen()完成初始化后,调用.
2021-11-04 09:58:04 303
原创 2021-11-4 堆和栈的区别
1、首先回顾C++的内存从高地址到低地址分别是栈区、堆区、全局区、常量区、代码区2、堆栈的区别(1)申请方式不同栈空间由系统自动分配,只要剩余空间大于申请空间,系统就会为程序分配内存。否则提示栈溢出。堆空间由程序员主动申请。操作系统有一个记录空间地址的链表。当系统收到程序申请时,首先遍历链表,寻找第一个空间大于所申请内存的堆结点,然后将该节点从空闲结点链表中删除,并将堆内存分配给程序。(2)申请大小限制不同栈空间由高地址向低地址扩展,其内存连续。堆空间是不连续的,堆的大小受限于计算机系统中有
2021-11-04 04:24:13 175
原创 2021-11-4 I/O多路复用
1、什么是I/O多路复用?I/O多路复用是指程序能同时监听多个文件描述符。在文件描述符可用的时候返回,对其进行读写操作。Linux下实现I/O多路复用的系统调用主要有select/poll/epoll。输入输出对象可以是文件file、网络socket以及管道pipe。他们都有文件描述符fd。2、常见的I/O模型有哪些?(1)阻塞等待模型 (BIO模型)阻塞等待是指一直等待需要的信息,阻塞程序的进行。优点:不占用时间片缺点:同一个只能处理一个I/O,效率低。解决方法:多线程/多进程,缺点:占
2021-11-04 03:05:51 212
原创 2021-11-3 OSI七层模型及其中的协议简述
0、什么是OSI模型?OSI模型是开放式系统互联通信参考模型。他将两台设备间的通信分为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。1、物理层的作用是什么?有哪些协议?物理层的作用是实现计算机结点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异,使上面的数据链路层不必考虑网络的具体传输介质是什么。物理层传输单位是比特流。2、数据链路层的作用是什么?有哪些协议?PPP/ARP/ ( CSMA/CD)数据链路层将数据封装成帧,并处理流控制,指定拓扑结构,提供硬件寻址。数据链
2021-11-04 01:24:23 251
原创 2021-11-3 翻转部分区间链表
题目描述:描述将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n)O(n),空间复杂度 O(1)O(1)O(1)。例如:给出的链表为 1→2→3→4→5→NULL1\to 2 \to 3 \to 4 \to 5 \to NULL1→2→3→4→5→NULL, m=2,n=4m=2,n=4m=2,n=4,返回 1→4→3→2→5→NULL1\to 4\to 3\to 2\to 5\to NULL1→4→3→2→5→NULL.思路:需要五个链表指针,
2021-11-03 22:16:06 109
原创 2021-11-3 内核态和核心态
1、什么是内核态?当一个进程进行系统调用而陷入内核代码中时,就称程序陷入了内核态。否则就是用户态。用户程序运行在用户态而操作系统运行在内核态。用户态只能执行非特权指令,而内核态可以执行全部指令。内核态可以执行的指令比如:执行I/O,设置时钟,内存清零等。用户态有三种方式可以进入到内核态,分别是系统调用、异常、以及外围设备的中断。2、什么时候内核态切换到用户态?系统调用:创建进程/线程、切换进程/线程异常:程序在运行中遇到了异常,这时需要切入到操作系统内核态中处理异常。异常类型比如缺页中断。缺页中断是
2021-11-03 19:35:30 1644
原创 2021-11-3 排序问题之——快速排序
快速排序的基本思想是分治思想,每一次选取数组首元素作为pivot,将大于它的数放在右边,小于它的数放在左边。基本思路就是首先从右往左找到小于pivot的元素,然后再从左往右找到大于pivot的元素,这时如果两个元素再原数组中的位置为大的在左边,小的在右边,就对他们进行交换。#include<iostream>#include<vector>using namespace std;void partition(vector<int>& input, int
2021-11-03 16:53:18 128
原创 2021-11-3 try catch异常处理
将异常分散在各处进行处理不利于代码的维护,尤其是对于在不同地方发生的同一种异常,都要编写相同的处理代码也是一种不必要的重复和冗余。如果能在发生各种异常时让程序都执行到同一个地方,这个地方能够对异常进行集中处理,则程序就会更容易编写、维护。简单的try throw catch应用。#include <iostream>using namespace std;int main(){ double m, n; cin >> m >> n; tr
2021-11-03 15:00:27 90
原创 2021-11-03 C++智能指针
1、为什么要引入智能指针?C++的智能指针是为了处理直接申请动态内存导致的内存问题的产物。所以引入智能指针,其保证在作用域结束时调用析构函数销毁对象,释放内存。关于析构函数的作用,也是为了删除动态申请的内存。这个时候只要把delete放在析构函数里,就会自动被调用。使用智能指针,可以避免同一块内存被释放两次等会使程序崩溃的情况发生。而为什么同一块内存被释放两次呢,这是因为C++中类的默认构造函数默认是浅拷贝,浅拷贝是指并不再为新类的变量开辟空间,尤其是指动态分配的内存,而是直接使用指针指向原来相同的那一
2021-11-03 14:59:36 182
原创 2021-11-03 new和malloc的区别
1、new是操作符,可以被重载,malloc()是库函数。C++不可以被重载的运算符,一共有五个,分别是(1).点运算符、(2)::命名空间运算符(3)?:条件运算符(4)*取值运算符(5)sizeof运算符2、new和malloc()都可以申请动态内存,但new申请的内存在自由存储区,而malloc()申请的内存在堆区3、new的返回值为严格按照申请声明的同类型的指针,而malloc返回void类型指针4、new的内存申请失败后抛出bad_alloc异常,malloc返回NULL可以使
2021-11-03 13:32:45 250
原创 2021-11-02 合并有序数组
合并两个有序数组,要求不使用额外空间,在原数组基础上修改数组。从后往前合并!可以避免挪位置。class Solution {public: void merge(int A[], int m, int B[], int n) { int index=m+n-1; int i=m-1,j=n-1; for(;index>=0;){ //A[index]=A[i]>B[j]?A[i]:B[j];
2021-11-02 23:59:46 130
原创 2021-11-02
遇到的笔试题,表示这一些类实例化的命名很少遇到。但编译可以通过的。#include#includeusing namespace std;class A{};class B :public A {};int main() {A a1;A a2=A();A *a3 =new A();A const& a4 = a1;int b;int const c = b;return 0;}...
2021-11-02 22:04:40 82
原创 2021-10-26 常见的线程的同步机制
1、互斥量2、临界区临界区指一个可以被公共访问,但每次指允许一个线程访问的程序片断。3、信号量资源数等于最大线程访问数,以此控制访问资源的线程数量。4、条件变量等待条件成立才可访问资源...
2021-10-26 15:19:38 59
原创 2021-10-26 操作系统为什么要分页
1、什么是物理地址就是内存条啦!2、为什么不直接使用物理地址?(1)直接使用物理地址意味着程序可以直接访问物理地址,这样如果误操作访问并修改了操作系统的相关内存,就造成了系统破坏。(2)系统有多个进程在运行时互相之间可以直接访问物理地址,直接导致结果奇奇怪怪,肯定也是不安全的。3、为什么使用地址空间?使用地址空间可以解决上述问题。但也还有新的问题,比如单纯使用地址空间+空间界限,当程序超出该内存块大小时,将无法自适应,需要新的技术,常见的有覆盖和交换。覆盖使内存空间中留下那些必须的指令,而交换是
2021-10-26 15:06:07 621 1
原创 2021-10-26 进程间通信——内存映射机制
内存映射与常规文件操作的区别是:常规文件操作需要从磁盘到页缓存再到用户主存的两次数据拷贝。而mmap操控文件,只需要从磁盘到用户主存的一次数据拷贝过程。分段和分页的区别:分页和分段存储管理有何区别?答:主要区别表现在以下三个方面:(1) 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。(2) 页的大小固定且由系统决定;而段的长度却不固定,决定于用户所编写的程序。(3
2021-10-26 13:31:54 97
原创 2021-10-25 文件读写C++
C++提供文件读写类fstream#includeofstream out("…", ios::out);ifstream in("…", ios::in);fstream foi("…", ios::in|ios::out);#include using namespace std;int main (){ifstream fr;ofstream fw;char word[200], line[200];fw.open("write.txt");fr.open("read.tx
2021-10-25 22:15:18 841
原创 2021-10-25 文件读写C语言
**读文件**1、使用FILE* file定义FILE结构体指针2、fopen()打开文件3、if(file==NULL)判断文件是否打开成功4、if(file!=NULL)则文件打开成功,打开成功后使用feof(file)判断是否读完文件,函数返回0时未读完,返回1读完。5、使用fseek(file,FileLength,SEEK_SET)设置文件读指针偏移。int fseek(FILE *stream, long offset, int fromwhere);6、使用fread(&a
2021-10-25 21:00:57 84
原创 2021-10-25 最长无重复子数组
解法:定义一个ump接受数字和下标,使用双指针,注意后面的指针只能往前标定,所以需要在ump命中时与ump的值比较大小。至于为什么需要在命中后继续更新max,按道理来说在命中后,长度一定是缩短才对,哦哦,知道了,因为命中的可能是过去的数字,也就是已经被抛弃的数字。所以需要每次都更新max。描述给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组数据范
2021-10-25 13:26:01 94
原创 2021-10-24 最小的K个数
寻找数组中最小的K个数方法一:建立大根堆注意:priority_queue默认是less<>大根堆,如果使用greater<>就是小根堆。class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { //最小的k个数 //建大小为k的大根堆 priority_queue<int
2021-10-24 23:29:35 53
原创 2021-10-24前序中序后序遍历二叉树
也没啥技巧就是注意怎么把结果腾出来这里用了引用设定好的数组的方法。/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: /** * * @param root TreeNode类 the root of binary tree * @return int整型vector&
2021-10-24 23:05:12 2003
原创 2021-10-24设计LRU缓存
注意:需要用到unordered_map和list两个数据结构,其中需要用到的方法有list.remove(int val),可以直接移除list中值为val的所有元素。而list.erase(iterator)是迭代器的精准删除。描述设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 k ,并有如下两个功能set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值提示:1.某个key的set或get操作一旦发生
2021-10-24 22:50:34 110
原创 2021-10-24 进程间通信——匿名管道
进程间资源独立,互相不能访问。所以需要进程间通信。进程间通信目的分为:数据传输、时间通知、资源共享、进程控制。1、 管道管道是内核内存中的缓冲器。管道拥有文件特质:读、写操作。字节序读写端相同。工作方式半双工。匿名管道只能在有亲缘关系的进程间使用。(父子、兄弟等)因为父子进程共享文件描述符表。管道的数据结构是环形队列。...
2021-10-24 02:15:22 117
原创 2021-10-23 进程创建、退出、僵尸进程、孤儿进程
进程创建 使用fork()函数创建子进程,返回值为pid_t,其实就是int#include<sys/types.h>#include<unistd.h>#include<stdio.h>int main(){ pid_t pid=fork();//创建子进程,在父进程中返回子进程ID,在子进程中返回0,返回-1表示子进程创建失败 pritf("%d %d ",getpid(),getppid());//返回pid ppid return 0;}
2021-10-24 00:36:23 224
原创 2021-10-23 进程概念
程序和进程程序中包含了一系列信息,这些信息用来指导操作系统如何在运行时创建一个进程。进程是正在运行的程序的实例。进程是操作系统最基本的资源分配单元,也是基本的执行单元。单道程序设计和多道程序设计单道程序设计即计算机内存中只允许一道程序运行。多道程序设计是指计算机内存中同时存放多道相互独立的程序。这些程序在管理程序控制下,穿插运行。对于单个CPU来说,程序在CPU上轮流运行。时间片指操作系统给多道正在运行的程序,即进程的分配的一段CPU运行时间。时间片由操作系统的内核调度分配给进程。并行和.
2021-10-23 17:45:05 509
原创 2021-10-23 内存对齐
C++自定义结构体和类中的数据都需要内存对齐。内存对齐,就是自定义数据中偏移量不为默认对齐系数的,需要进行字节填充。对于64位操作系统,内存对齐系数默认为8,(8位1字节,64位8字节),对于32位操作系统,内存对齐系数默认为4。内存对齐的好处有以下:方便计算机读取数据,提高了读取效率;便于在不同平台中进行移植,因为某些硬件设备不支持非内存对齐的内存读取。#include<iostream>using namespace std;struct A { int a; //4 char
2021-10-23 00:34:16 880
原创 2021-10-22 static的使用 C++
static代表定义静态变量或方法,对于static的用法,我一共总结为两种,分别是在类中和在类外,下面分这两种情况进行阐述。在类中定义静态成员变量对于类中的static成员变量,其存储地址在内存中只有一份,并且被每一个实例化的对象共享,如果static成员变量在其中一个实例化的对象中更改,则其他所有实例化的对象中static成员变量都更改。因为实际上share同一份内存。作用:解决类中的变量不属于实例的问题。class A {public: static int a;}; int A:
2021-10-22 16:10:03 119
原创 2021-10-22 STL模板内容整理
容器类名::iterator 迭代器名; 定义一个正向迭代器 。unordered_map<int, int>::iterator it;
2021-10-22 11:29:17 65
原创 2021-10-21 记录常用的API
1.vector.insert()iterator insert( iterator loc, const TYPE &val );void insert( iterator loc, size_type num, const TYPE &val );void insert( iterator loc, input_iterator start, input_iterator end );insert() 函数有以下三种用法:在指定位置loc前插入值为val的元素,返回指向这个元素
2021-10-21 22:50:40 38
原创 2021-10-19 递归构造链表+反转链表
递归构造链表+反转链表注意事项:1、使用getline(cin,s)获取一整行的带空格的字符串2、链表循环条件while(cur&&cur->next)3、//1 2 3 出循环时,cur的位置在链表最后一个非空节点,此时cur->next指向nullptr,需要增加一行,将cur->next=tmp2;#include<iostream>#include<vector>#include<string>using name
2021-10-19 12:56:14 166 1
原创 2021-10-18 递归法构造一棵二叉树
递归法构造一棵二叉树注意事项:1、stoi(s)函数,使用时,s不可以为空2、TreeNode结构体,构造函数成员初始化列表的写法:TreeNode(int val, TreeNode* left, TreeNode* right) :val(val),left(left),right(right){ }#include<iostream>#include<vector>#include<string>#include<deque>us
2021-10-18 22:47:39 97
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人