
笔记
一天开始了
往前看
展开
-
哈希表的简单实现
在学习数据结构时,看到了有关哈希表的使用,虽然STL模板库里已有相关的实现,但我想简单实现下它的功能。哈希表可以通过哈希函数来存储和查找值,这里我使用了较为简单的哈希函数,大大增加了其冲突的概率,我对冲突的处理使用的是链地址法。虽然我使用了模板,但其实只限于 对int类型的处理,这跟我的哈希函数有关,往后我会改进,先写个简陋的版本。#include <iostream>template<typename T=int>class Hash{ enum state原创 2022-02-27 20:58:51 · 357 阅读 · 0 评论 -
线程池_理论
简单复习下线程池的原理,为接下来线程池的实现做准备。1.概念1.什么是线程池? 线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。例如,假设你有需要处理的十个任务,将这些任务加入到任务队列中。线程池中有预先创建的5个线程。这5个线程通过竞争在任务队列中获得任务去完成。2.为什么使用线程? 1).降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁造成的消耗。 2).提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行原创 2022-02-17 19:37:24 · 203 阅读 · 0 评论 -
Linux下线程的使用(二)
昨天稍微讲了下线程的使用,今天把昨天的内容稍微扩展一下。明天将写一个独自封装的线程池。1.pthread_join()int pthread_join (pthread_t thread, void** retval);线程等待函数,等待thread线程结束,成功返回0,失败返回错误吗。1.thread 是所等待的线程2.retval 用于接收线程的返回值,如果没有返回值置为NULL。#include <stdio.h>#include <unistd.h>#in原创 2022-02-16 18:27:40 · 874 阅读 · 0 评论 -
Linux中线程的使用(POSIX线程库)
1.概念1.什么是线程? 线程是程序的执行路线,而进程是运行中的程序,通俗讲,线程就是进程的子任务,一个进程可以有多个子任务,即可以拥有多个线程。2.线程的特点: 1).不拥有自己独立的内存资源,共享进程的代码区、数据区、堆区(注意没有栈区)、 环境变量和命令行参数、文件描述符、信号处理函数、当前目录、用户ID和 组ID等资源. 2).线程拥有自己独立的栈,因此也有自己独立的局部变量. 3).线程的系统开销小,任务切换快,相对于进程来说。2.线程函数1.pthread_create(原创 2022-02-15 19:23:01 · 1366 阅读 · 0 评论 -
简单畅谈——进程
今天的内容依然是对我之前内容的理解,大家想看详细的进程,可以去浏览我之前的文章。1.概念1.什么是进程? 进程就是运行中的程序。 进程一般分为交互进程、批处理进程和守护进程三类。 同时,根据进程间的关系分为子进程和父进程。根据父子进程的运行状态又可以有 孤儿进程和僵尸进程。(这里涉及到资源回收的问题, 大家注意孤儿进程是会被收养的,其资源可以被回收,而僵尸进程,由于子进程先接受,父进程无法回收其资源) 进程资源是有限的,如果不回收进程资源,则会浪费资源,使得其他进程的开辟产生问原创 2022-02-14 21:29:08 · 222 阅读 · 0 评论 -
文件系统(下)
今天写的东西,在我很早之前就写过了。我就简单写段代码来讲解,巩固一下知识。1.lseekoff_t lseek(int fd,off_t mov,int pos);fd : 为文件描述符mov : 为文件的偏移位置 正为向后操作,负为向前操作该函数成功返回当前位置,其实就是返回pos : 文件开始操作的位置 SEEK_SET //起始 SEEK_CUR //当前 SEEK_END //末尾文件操作时,其文件位置会自动发生偏移。#include <stdio.h>原创 2022-02-13 21:49:20 · 99 阅读 · 0 评论 -
文件系统(一)
由于最近毕设用到了文件系统相关的知识,所以今天把文件系统的知识再巩固一下,最近要查找文献,写论文,所以不定期更新。本期内容在之前的博客中已有相关,大家可以翻阅。1.系统调用1、Unix/Linux大部分系统功能是通过系统调用实现的,如open/close。2、Unix/Linux的系统调用已被封装成C函数的形式,但它们并不是标准C的一部分。3、标准库函数大部分时间运行在用户态,但部分函数偶尔也会调用系统调用,进入内核态,如malloc/free。4、程序员自己编写的代码也可以调用系统调用,与操作原创 2022-02-12 18:14:19 · 771 阅读 · 0 评论 -
C++ 面向对象三大特征总结(详解)
1.面向对象的三大特征1).封装 封装:将一个对象的全部的属性变量和行为方法进行包装(集中到一个类中,), 并用权限对其成员属性和成员方法加以限制,使得外部对其访问时,不能随意改变该包装.#include <iostream>using namespace std;class Shape{private: int x;//重心的横坐标 int y;//重心的纵坐标public : Shape(int x = 0,int y =0):x(x),y(原创 2021-09-20 13:48:38 · 1572 阅读 · 0 评论 -
C++_引用和指针的区别
最近做刷题时遇到了许多有关引用的问题,发现只会用,而没有好好总结其用法,今天,我大概总结了一些用法.如有不足,希望大家多多帮助.1.引用和指针 指针:即内存地址,一个指针变量,存储的是所指向对象的内存地址,所以所谓指针变量最终还是一个变量,不同于原来的对象. 引用:引用是对同一个对象变量取了一个别名,我们可以通过不同的名字去调用它.所以引用的对象没有发生改变.2.两者区别 指针:我们都知道存在空指针,即指针里存储的地址为空,没有指向的对象. 1.type* :声明为tyep类型的指针原创 2021-09-19 14:31:50 · 287 阅读 · 0 评论 -
顺序容器_deque
1.双端队列dequedeque 的存储按需自动扩展及收缩。扩张 deque 比扩张 std::vector 更优,因为它不涉及到复制既存元素到新内存位置。另一方面, deque 典型地拥有较大的最小内存开销2.用法详解#include <iostream>#include <deque>#include <vector>using namespace std;//函数模板template<typename T>void print(原创 2021-09-12 14:56:54 · 107 阅读 · 0 评论 -
array的相关用法
1.array头文件:#include <array> array和vector容器类似,用法类似,但vector功能更加强大,array容器是一个静态的容器,则意味他的容器大小,在初始化是就已经固定好了其大小.而vector动态容器其容量大小可能跟则操作发生改变,例如使用insert()插入一个元素时,而array容器固定,如果使用insert()方法,每次调用前还得判断是否元素个数是否溢出,就十分不方便,所以array就没有一些影响容量大小的常用方法.2.常见用法#includ原创 2021-09-11 11:46:09 · 642 阅读 · 0 评论 -
vector的用法详解
1.vector什么是vector呢? 让我简单的介绍一下它的特点.1.它是一个容器,所谓容器也就是能够存储东西的器具,而在C++中它相当于一个动态的连续数组,能够存储各种类型的数据,它是一个顺序容器.2.在底层中是一个类模板.能够实现许多非常强大的功能.2.vector相关用法我大概整理了它的常见用法,#include <iostream>#include <vector>using namespace std;int main(){ //vect原创 2021-09-11 10:16:15 · 427 阅读 · 0 评论 -
函数模板 和 模板函数
有许多函数的功能相似,只是变量的类型不同,在语言中,处理这种问题,我们往往只能用void*来处理,但常常又会在数据转换时发生问题.在c++中函数模板就很好的替我们解决了这个问题.template< typename T> 模板<未知变量类型 T>#include <iostream>#include <typeinfo>#include <cstring>using namespace std;class A{};/*temp原创 2021-09-09 22:46:12 · 158 阅读 · 0 评论 -
线程的相关知识_day03
这是我最后一天分享线程的相关知识,冲冲冲O(∩_∩)O1.线程共享资源的访问当多个线程同时访问其所共享的线程资源时,需要相互协调,以防止出现数据不一致,不完整的问题,这就叫线程同步.1).互斥量...原创 2021-08-22 21:58:35 · 105 阅读 · 0 评论 -
线程的相关知识_day02
冲冲冲,O(∩_∩)O1.获取线程自身的ID1.pthread_t pthread_self(void);2.成功返回调用线程的ID,不会失败2.比较两个线程的IDint pthread_t pthread_equal(pthread_t t1,pthread_t t2); 若参数t1何t2所标识的线程ID相等,则返回非零,否则返回03.终止线程1.从线程过程函数中return2.调用pthread_exit函数void pthread_exit(void *retval);原创 2021-08-21 20:48:54 · 71 阅读 · 0 评论 -
线程的相关知识 day01
刚刚休息了,今天再发一篇博客,今天开始(总共三天),我会发表一些线程的相关知识,请大家能够寻找我的不足,谢谢xdm了.冲冲冲 O(∩_∩)O.1.线程概念 何为线程呢?我的理解就是与就是一个进程的一个控制单元,一个进程至少有一个线程,线程可以与 进程共享堆和方法区的资源,但线程拥有自己的局部变量,也就是说拥有自己的栈区,由于它是与进程共享内存,不像进程那样拷贝内存空间,这使得多个线程来回切换时,负担小的许多,这也时线程的优势,如果我们之前的网络银行用线程会变得方便许多,就不用反复的读取文原创 2021-08-20 23:13:33 · 84 阅读 · 0 评论 -
进程和文件共享
前几天在写基于TCP的网络银行时,想到当用进程时如何共享文件而不起冲突时,我联想到了文件锁,虽然也可以用线程来完成项目,但由于,博主是初学者,还是尝试用了一下进程来完成了这个项目.直接上干货,冲冲冲1.进程我们得先了解一下进程1.每个进程都有自己独立的一块内存空间,一个进程可以有多个线程2.父子进程,fork之后:父子相同处: 全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式父子不同处: 1.进程ID 2.fork返回值 3.父进程I原创 2021-08-20 20:42:00 · 388 阅读 · 0 评论 -
基于TCP的网络银行_day01
三天,我会向大家展示我写的网络银行的项目,由于虚拟机出现了问题,今天我先写思路和整体的框架。开整——冲冲冲!!!!1.布局1.我们肯定需要一个服务端和客户端,我们需要新建两个文件夹分别实现客户和服务端的功能 (这两个主要是实现信息的交互反馈)//我们将其明明为:server 和 client2.然后,既然是服务系统,那我就需要保存客户的信息,我们就需要文件读取保存信息, 那我们就需要再建一个文件夹来实现文件读取的功能//我们将其命名为:fileoper3.既然,我们保存了数据,那么后台每次读取原创 2021-08-15 17:54:39 · 348 阅读 · 2 评论 -
基于TCP的网络通信
电脑出了故障,木得及时更新,多多见谅,直接开干,( ̄︶ ̄*))socket,bind,connectd等使用方法,我已在上篇博客讲述,就不再累述了。1.listenlisten(int sockfd,int backlog);将sockfd参数所标识的套接字记为被动模式,使之可用于接受连接请求。backlog表示未决连接请求的最大长度,即最多同时又多少个未决连接请求存在,当未决连接数超过最大长度,则客户端的coonect()函数返回 -1.2.acceptint accept(int原创 2021-08-15 15:06:58 · 150 阅读 · 0 评论 -
网络通信—本地通信
O(∩_∩)O 冲冲冲 =====( ̄▽ ̄*)1.创建套接字 int socket(int domain,int type,int protocol); domain值: 1.AF_UNIX ,AF_LOCAL 本地通信 2.AF_INET 为IPv4 3.AF_INET6为IPv6 type值: SOCK_STREAM 数据流 SOCK_DGRAM 数据报 protocol: 特别通信协议 ,一般不用,置0即可2.准备通信地址 基本地址类原创 2021-08-11 20:58:26 · 589 阅读 · 0 评论 -
消息队列—初级
泄气了,继续冲!!!O(∩_∩)O这篇文章只是为了 我整理思路 大家有不懂的可以评论,下方 我也是初学者,大家一起讨论。#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdbool.h>#define PATH "."#define SERVER 100 //服务器#define CLI原创 2021-08-10 22:23:52 · 86 阅读 · 0 评论 -
文件锁
文件锁仅在不同进程间访问起作用。通过锁同步多个进程对同一个文件的读写访问。#include<stdio.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#include<sys/types.h>#include<stdlib.h>#define LEN 1000void menu(){ printf("------------------------原创 2021-08-06 20:32:49 · 110 阅读 · 0 评论 -
文件系统
U•ェ•*U follow me !!! 明天写文件锁记得 关注我哦!1.sync/fsync/fdatasync1.用于强制磁盘文件与缓冲区同步。2.sync将所有被修改过的缓冲区排入写队列即返回,不等待写磁盘操作完成。3.fsync只针对一个文件,且直到写磁盘操作完成才返回。4.fdatasync只同步文件数据,不同步文件属性。 #include <unistd.h> void sync(void); int fsync(int fd); i原创 2021-08-04 20:42:16 · 86 阅读 · 0 评论 -
文件描述符 和 文件相关系统调用
冲冲冲 follow me!!!O(∩_∩)O1.文件描述符1.非负的整数。2.表示一个打开的文件。3.由系统调用(open)返回,被内核空间(后续系统调用)引用。4.内核每次打开时,都会自动为每个进程自动缺省三个文件描述符: 1).stdin 0 ------------标准输入 2).stdout 1 ------------标准输出 3).stderr 2 -------------标准出错 这意味着每次开始时,每个进程的文件描述符从3开始。5.文件描述符的范围介原创 2021-08-03 21:00:17 · 156 阅读 · 0 评论 -
希尔排序
O(∩_∩)O希尔排序优点:时间复杂度为nlog₂n 先对于插入排序而言 能够较为快速的排序数组。 81 void shell_sort(int arr[],int n){ 82 int step,i,j; 83 for(step = n/2;step>0;step=step/2){ 84 for(i=step;i<n;i++){ 85 int key=arr[i]; 86 for(j =原创 2021-08-02 19:16:25 · 94 阅读 · 0 评论 -
插入排序
O(∩_∩)O 冲冲冲!!!1.插入排序思路是依次挑一个关键字插入前面已排好顺序的数组中。 14 void insert_sort(int arr[],int N){ //arr为数组名,N为数组长度(升序排列) 15 int i; 16 int j; 17 for(i=1;i<N;i++){ /*把数组的第二个元素作为关键字插入到前面, 刚开始前面就一个元素,所以已经有序了*/ 18 int key=arr[i]; //保存ke原创 2021-08-01 21:37:47 · 70 阅读 · 0 评论 -
数据结构——树
直接开干,冲冲冲!!!(这篇文章只包含一些基础知识,下篇我将会分享些代码,希望大家能够学号基础)1.树的基本概念1).树是包含n个结点,n-1条边的有穷集合。2).父结点:含有子结点的结点称为父结点(或者是双亲结点),且没有父结点的结点称为根结点。3)....原创 2021-08-01 14:15:52 · 179 阅读 · 0 评论 -
c语言输入函数
c语言输入函数1.scanf int scanf(const char *format, ...); // ...表示多变量输入例如:int a;scanf("%d",&a);//变量前要加上&符char arr[10]={};scanf("%s",arr);//字符数组就不需要 因为数组名代表首地址scanf("%d %s",a,arr);读取原理:把读取的数据存入对应变量。它以空格、制表符、回车符为读取的结束符。例如:int a;int b;scanf原创 2021-06-01 09:49:07 · 1797 阅读 · 1 评论 -
数组和指针
数组和指针数组的定义:原创 2021-05-31 09:01:39 · 70 阅读 · 0 评论