- 博客(63)
- 收藏
- 关注
原创 大数运算
计算机中的各种类型的数据都是有其表示上限的当进行很大的数据运算时可能产生溢出,这时就要用的大数运算 大数运算是将数据保存在数组或者string,vector的容器中进行运算这样就可以进行几十位甚至上百位的运算#pragma once#include <string>#include <iostream>#include <unistd.h>#include <stdlib.h>enum FL
2017-07-26 20:10:48
861
原创 基于HTTP和大数运算的在线计算器
**关于HTTP的具体的描述网上一大堆本文不在赘述#include "http.h"int starup(const char* ip,int port){ int sock = socket(AF_INET,SOCK_STREAM,0); if(sock < 0) { perror("socket"); return -1; }
2017-07-26 19:49:31
4296
原创 用shell脚本编写彩色进度条
以前写过一个C的Linux下的进度条这次用shell脚本编写进度条基本的逻辑与一起C的没有大的区别这次的中的放在彩色上 可以用printf函数进行色块控制字背景颜色范围:40----4940:黑41:深红42:绿43:黄色44:蓝色45:紫色46:深绿47:白色字颜色:30-----------3930:黑31:红32:绿33:黄34:蓝色35:紫色36:深绿37:
2017-07-11 14:28:21
586
原创 Linux eval
1. eval command-line其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:pipe="|"eval ls $pipe wc -lshell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。如果变量中包含任何需要sh
2017-07-03 17:27:56
355
原创 set/multiset map/multimap hash_set/hash_multiset hash_map/hash_multimap 区别与联系
set/multiset联系底层使用红黑树作为数据结构 set/multiset 特性是所有元素都会根据元素键值自动排序,set/multiset元素的键值就是实值,实值就是键值。 不能通过迭代器来修改set/multiset的实值因为他们的实值就是键值,修改后可能不满足其排列规则 set/multiset拥有与list相同的某些性质:当客户对他的元素进行insert或erase是操作之前的所
2017-07-01 22:11:50
480
原创 Linux poll服务器
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <poll.h>#define MAX
2017-06-29 17:43:45
423
原创 Linux epoll服务器、epoll、poll、select优缺点
epoll、poll和select优缺点select优点(1)select()的可移植性更好,在某些Unix系统上不支持poll() (2)select() 对于超时值提供了更好的精度:微秒,而poll是毫秒缺点(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大 (2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也
2017-06-29 17:40:35
531
原创 Linux select服务器
select原理系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、st
2017-06-28 22:28:06
1235
原创 udp_server
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <string.h>void usage(char* arg){ printf("%s [server_ip
2017-06-26 16:38:57
366
原创 Linux线程池原理及C++实现
原理在多线程程序中如果频繁的创建和结束一个线程这样会使系统的性能降低,这时我们可以创建一个线程 池来完成这些任务执行完后让其阻塞等待其他的任务这样就可以提高系统的性能 一个线程池要包括以下几部分 1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务; 2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行
2017-06-24 19:17:55
764
原创 Linux套接字编程tcp_server
背景知识介绍socketsocket这个词可以表示很多概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端⼜⼝口号”就称为socket。网络字节序在两台主机进行通信时如果直接将网络上的数据拿来进行解析如果两台主机之间的字节序不同这样数据就会出错但是又不知道对方主机的字节序,所以就规定了网络字节序为大端接口介绍Linux提供了以下函数用来进行主机
2017-06-22 22:34:45
446
原创 tcp协议相关
TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传输结束后要释放连接。TCP不提供广播和多播服务。由于TCP提供可靠的、面向连接服务因此不可避免的增加了很多开销,如确认、流量控制、计时器以及连接管理等。这不仅使协议首部数据单元增大很多,还要占用很多处理机资源TCP可靠性表现1.基于请求应答机制 2.保证报文按序到达 3.丢包重传 4.面向连接的——在操作系统中应该有对应的数据结构描
2017-06-20 16:13:17
561
原创 网络端口分类
网络通信的实质是两台主机上的进程进行通信,但是IP地址只能标识一台主机并不能标识主机上的进程这时就需要端口来标识主机上的进程也称做协议端口号,这种在协议栈层间抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念,硬件端口是不同设备之间进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址端口的分类服务器使用的端口这里分为两类最重要的一类叫做数只端口号或者系
2017-06-16 14:40:19
704
原创 代理服务器 和NAT技术
一、代理服务器的概念及工作原理(一)代理服务器的概念 随着Internet技术的迅速发展,越来越多的计算机连入了Internet。很多公司也将自己公司的局域网接入了Internet。如何快速地访问Internet站点,提高网络的安全性,成为了当今的热门话题。在这种情况下,代理服务器便应运而生了。 1、代理服务器的概念 代理服务器(Proxy Server)是个人网络和Interne
2017-06-13 16:45:46
469
原创 CRC检验与ARP脚本
CRC(Cyclic Redundancy Cheek)循环冗余检验是目前在数据链路层广泛使用的检错技术 Mac帧形式 目前FCS多采用CRC CRC原理 在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的
2017-06-10 20:18:42
639
原创 crond与crontab
crond的概念和crontab是不可分割的。crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语chronos(χρόνος),原意是时间。而crond正是它的守护进程。 cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表
2017-06-09 11:26:51
500
原创 守护进程的创建过程
守护进程也称精灵进程(Daemon),是运行在后台的⼀一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等 Linux系统启动时会启动很多系统服务进程,这些系统服 务进
2017-06-08 11:11:42
794
原创 Huffman树的实现
假设给定一个有n个权值的集合{w1,w2,w3,…,wn},其中wi>0(1<=i<=n)。若T是一棵有n个叶结点的二叉树,而且将权值w1,w2,w3…wn分别赋值给T的n个叶结点,则称T是权值为w1,w2,w3…wn的扩充二叉树。带有权值的叶节点叫着扩充二叉树的外结点,其余不带权值的分支结点叫做内结点。外结点的带权路径长度为T的根节点到该结点的路径长度与该结点上的权值的乘积。n个外结点的扩充二叉树
2017-06-06 16:58:59
540
原创 堆的实现
如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki<= K2*i+1 且 Ki<= K2*i+2(Ki >= K2*i+1 且 Ki >= K2*i+2) i = 0,1,2…,则称这个堆为最小堆(或最大堆)。 大堆:根节点的关键字大于其他所有节点的关键字它的左右子树也满足这个性质 小堆:根节点的关键字小
2017-06-06 16:47:43
355
原创 linux GDB 调试多进程多线程
在Windows下调试程序我们直接打断点F10,F11等键加上监事窗口的调试程序就很方便了,但是在Linux下并没有集成的开发调试环境这时就要用到GDB GDB常用调试命令 l ist/l ⾏行号:显⽰示binFile源代码,接着上次的位置往下列,每次列10⾏行。 list/l 函数名:列出某个函数的源代码。 r或run:运⾏行程序。 s或step:进⼊入函数调⽤用 breaktrace
2017-06-06 16:35:05
477
原创 红黑树与迭代器的实现
红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色,可以是red或者black,通过对任何一条从根节点到叶子结点上的简单路径来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似平衡。红黑树具有一下性质 1、每个节点不是红的就是黑的 2、根节点一定是黑的 3、没有连在一起的红色节点 4、从根节点到每个叶子的路径上的黑色节点数目相等#pragma once#includ
2017-06-03 17:04:35
1105
1
原创 二叉搜索树实现
二叉搜索树又称二叉排序树他是一颗空树或者具有一下性质的树 若他的左子树不为空那么它的左子树的所有节点的键值都小于根节点的键值 若他的右子树不为空那么它的右子树的所有节点的键值都大于根节点的键值 它的左右字数也是二叉搜索树对于二叉搜索树查找一个节点在一般情况下具有O(log2(n))的时间复杂度对于单支的情况下退化为O(n)本文采用键值对的方式实现二叉搜索树,建立二叉搜索树是通过插入一个个的节点
2017-05-30 10:13:07
319
原创 基于Huffman编码的文件压缩
文件压缩有很多种算法本文介绍的是基于Huffman算法的文件压缩 对于Huffman压缩最重要的就是建立Huffman树与重建Huffman树,本文对如何建立Huffman树不做重点讨论 首先将源文件遍历一遍统计其中每个字符出现的次数并将其 保存在下面的结构体中struct FileInfo{ FileInfo(unsigned char ch = char()) :_
2017-05-14 23:04:05
630
原创 线索二叉树
当某节点的左指针为空时,令该指针指向按照某种方式遍历二叉树时得到该节点的前驱结点;当某节点的右指针为空时,令该指针指向按照某种方式遍历二叉树时得到该节点的后继结点。但问题是无法区分:左指针指向的结点是左孩子结点还是前驱结点,右指针指向的结点是右孩子结点还是后继结点。因此需要增加两个线索标志位来区分这两种情况:#pragma once#include <iostream>using namespac
2017-05-08 19:09:03
378
原创 二叉树的创建与前中后序遍历递归非递归
树的定义是递归的所以二叉树的定义也是递归的,一般先定义它的根节点在定义它的左子树再定义它的右子树,就像先序遍历一样struct Node{ Node(T data = T()) :_data(data) ,_lChild(NULL) ,_rChild(NULL) {} T _data; Node* _lCh
2017-05-01 20:01:26
473
原创 用递归的方法实现输出一个十进制数的每一位
#include<stdio.h>int print_every_bit(int n){ while(n!=0) { int i=0; i=n%10; n/=10; printf("%d ",i); print_every_bit(n); break; } return
2017-04-22 17:03:04
717
原创 用两个栈实现一个队列
队列的特性是先进先出,栈是先进后出基于这种特性可以用一个辅助栈用于在pop和front是的操作其他的操作都可以用一个栈实现 在pop或front时将数据逐个出栈并且入到辅助栈中此时辅助栈的栈顶就是需要pop或front的元素之后再将元素放回原来的栈 在pop或front时 完成后将元素放入原栈template<typename T>class Queue{public:
2017-04-18 18:01:04
300
原创 括号匹配问题——用栈实现
一个字符串中的括号的不匹配分为左括号多,右括号多或者次序问题在检测一个字符串中的字符如果是括号并且是左括号将它入栈,如果是右括号判断与栈顶元素是否匹配如果匹配将栈顶元素出栈如果不匹配返回false并输出括号次序不匹配。当栈为空且字符串没有遍历完时返回false输出右括号多于左括号,当字符串遍历完时栈不为空则返回false输出左括号多于右括号。只有当栈为空且遍历完字符串时括号才匹配bool IsBra
2017-04-18 12:41:59
1202
原创 简单的文本行编辑程序——基于栈
一个简单的行编辑程序的功能是:接受从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入是,不能保障不出差错,因此,若在编辑程序中,“每接收一个字符立即存入用户数据区”的做法显然不是最恰当的。较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行数据,然后逐行存入用户数据区。允许用户输入出现差错,并在发现有误是可以及时更正。比如当用户发现上一个字符是错的可以输入#表示上一个字符无效,
2017-04-17 21:28:56
3933
原创 十进制转换为二进制 八进制 ——用栈实现
数制转换有很多方法本文用的是用栈来实现栈有先进后出的特性利用这个特性可以实现将目标数取模的值存放在栈中最后一次出栈就可以得到转换好的数void NumberConvert(int num ,int dest){ if (2 == dest) { stack<int> s; while (num) { int n
2017-04-17 21:10:48
1073
原创 模拟实现进程调度——采用高优先数优先和先来服务算法
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 进程的运行时间以时间片为
2017-04-15 09:28:46
7232
原创 复杂链表的复制
在复杂链表中不仅有一个指向下一个节点的_next 域还有一个随机域_randtypedef struct List{ int _data; struct List* _next; struct List* _rand;}List,*pList;在复杂链表的复制中我们可以先将随机域全部置NULL其他节点复制下来然后定义一个计数器每次进入前将其置零记录源链表的
2017-04-06 12:40:22
261
原创 防止一个类被继承
要防止一个类被继承可以将他的构造函数和析构函数都设置为private权限class A{private: A() {} ~A() {} int _a;};class B:public A{public: B() {} ~B() {} int _b;};这样做造成A类也无法构造对象还可以将要防止被继承的类设置为另一个类的private友元
2017-04-04 11:36:52
556
原创 让一个类只能在对上创建对象或者只能在栈上实例化
要让一个类只能在堆上创建对象可以将其构造函数的访问权限设置为private通过在public访问权限的函数中通过new来创建对象class A{public: A* GetA() { return new A(); }private: A() :_i(0) {} int _i;};int main(){ A* pa = NULL; pa->GetA(
2017-04-03 19:29:38
510
原创 死锁的产生条件及解决方法
产生死锁的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进
2017-04-02 10:49:26
315
原创 C++多态与虚函数
多态是C++的三大特性之一多态分为 动态多态,静态多态;其中静态多态分为,函数重载,泛型编程;动态多态为虚函数。静态多态是在编译时就确定的,动态多态是在程序运行过程中确定。本篇文章主要讨论虚函数:虚函数通过基类的引用或者基类指针来调用。class Base{public: virtual void Funtest1(void) { cout<<"Base::Funtes
2017-03-18 14:31:59
382
原创 Linux环境下共享内存
共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,
2017-03-16 19:17:46
364
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人