自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 资源 (2)
  • 收藏
  • 关注

原创 (C++实现)输入两个链表,找出它们的第一个公共结点

方法一:先数出两条链表的长度,得到长度差d,先将长链表从头结点往后走d步,之后第二个链表从头开始,两个链表一起一步一步走,直到两个链表的节点第一次相等为止,此时指针位置即为所求。 ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode *p1=pHead1; L...

2018-06-22 21:08:42 1815 1

原创 C++实现动态规划解决在数组中找出指定和的数字

题目:给定一些数,要求找出相加等于100的所有数。有唯一解。例:输入:1,4,57,63,32输出:1,4,63,32思路:从前往后遍历,每个数字有两种对待方法——要或者不要。所以用到递归。先要,之后进行后续递归。如果没有得到结果,就不要这个数字,继续递归。都不行的话就是没有解。代码:#include<iostream> #include<vector> using nam...

2018-06-22 15:28:19 1969

原创 检测“双重叠“字符串C++实现

用双指针进行遍历,当两个字符一样的时候再用循环判断是否是双重叠。#include <iostream> using namespace std; int main() { while(1){ string a; cin>>a; if(a.size()<1) continue; if(a=="q") return 0; int max=0,star=0...

2018-06-01 22:02:50 1179

原创 判断单链表中是否有环/两列表是否相交系列问题及C++实现

题目:1.给一个单链表,判断其中是否有环的存在;2.如果存在环,求出环上节点的个数;3.如果存在环,找出环的入口点;4.如果存在环,求出链表的长度;5.如果存在环,求出环上距离任意一个节点最远的点(对面节点);6.(扩展)如何判断两个无环链表是否相交;7.(扩展)如果相交,求出第一个相交的节点;解答:1.给一个单链表,判断其中是否有环的存在;运用快慢指针来确定:每次快指针走两步,慢指针走一步。如果...

2018-05-30 17:06:44 762

转载 C++中时间与字符串之间的相互转换

1、常用的时间存储方式 1)time_t类型,这本质上是一个长整数,表示从1970-01-01 00:00:00到目前计时时间的秒数,如果需要更精确一点的,可以使用timeval精确到毫秒。 2)tm结构,这本质上是一个结构体,里面包含了各时间字段 struct tm { int tm_sec; /* seconds after the m...

2018-03-23 22:17:39 4273

原创 最大子序列和问题O(N)

问题描述: 给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。 解决思想: 要想让时间复杂度为O(N),就只能用一个for(或while等的)循环。即遍历一遍数组。 1.我们可以从头遍历,把每一个元素相加,每加一次就与最大和进行比较,留下最大的; 2. 小于0的元素不可能成为最大子序列的第一或最后一个值(把它去掉的子

2017-11-30 10:58:05 722

原创 C++中的cin函数和异常的来源(failbit)与处理(clear)

cin小知识点 可以将hex,oct,dec控制符与cin一起使用,来指定输入解释为16,8,10进制格式。 例如:下列语句可以将12或0x12解释为16进制的12或10进制的18,将ff(FF)解释为10进制的255. cin>>hex; cin>>机制: 跳过空白(空格,换行符,制表符),直接在输入流中抽取非空白字符。 cin的成员函数 cin.get()与cin.getline

2017-11-06 22:57:10 3087

原创 C++中cout格式化输出的相关函数与控制符

cout<< <<为插入运算符,重载后可识别C++中的所有基本类型(unsigned signed char short int long float double以及组合) ostream& operator<<(type); 通过看上面的函数原型。由于返回输出运算符引用,即cout。可实现拼接(一行中多次输出) char name[10] = "hello"; char* p = name;

2017-11-06 00:22:52 1359

原创 C++类型转换运算符

dynamic_cast用于(指向派生类对象的)基类指针转换成派生类指针。 如果转换失败,则返回0,即空指针。(通过判断转换是否成功,来决定是否用派生类里的函数(基类中可能没有那个函数))class A {}; class B : public A {}; class C : public B {}; A* a = new A; A* b = new B; A* c = new C; //指向B(

2017-10-27 23:11:54 368

转载 欢迎使用优快云-markdown编辑器

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl

2017-10-27 22:19:27 234

原创 C++中cin和cout中不会被注意的细节(字符串的处理)

cout.put(ch); 与cout cin cin使用空白(空格,制表符和换行符)来确定字符串的结束位置。 例子: #include using namespace std; int main() { char ch[20]; cin >> ch; cout << "ch = " << ch << endl; } 可以看出

2017-09-10 23:27:20 1479

原创 C++基础——类与对象(下)

赋值运算符重载函数 类名& operater=(const 类名& 形参){ // 赋值操作 return *this; } 调用时机: 赋值 代码 Bill Bill::operator=(const Bill& b){ price = b.price; count = b.count; discount = b.discount; if(N

2017-07-20 17:53:52 520

原创 C++基础——类与对象(上)

面向对象四大特征: 特征 说明 类比 抽象 抽出具体事物的普遍性的本质 分门别类:鸟类、哺乳类、鱼类 封装 把数据与处理(函数)包在一起 通信录(增加、删除) 继承 数据与处理(函数)的传承

2017-07-20 16:42:21 337

原创 从C到C++过渡知识

输出Hello World案例: 创建文件: vim HelloWorld。cpp源代码: #include using namespace std; int main(){ cout<<"Hello world"<<endl; }编译: g++ HelloWorld.cpp -o HelloWorld执行:./HelloWorld结果: Hello world本文件中C和C++

2017-07-13 22:16:23 545

原创 线程池编程

概念: 为什么————频繁创建和销毁线程浪费CPU资源。 是什么————一堆线程放在一个池子里统一管理。 流程: 1.初始化线程池、任务队列和工作线程。 2.向任务队列中添加任务。 3.将等候在条件变量(任务队列上的任务)上的一个线程唤醒并从该任务队列中取出第一个任务给该线程执行。 4.等待任务队列中所有任务执行完毕。 5.关闭线程池。 工作原理: 1.首先,建立一个用来存放需

2017-06-30 10:29:22 425

原创 socket 中 TCP 和 UDP 编码流程

TCP socket: Server: listenfd = socket() struct sockaddr_in //内部数据必须是网络序 sin_family sin_addr sin_port bind(listenfd) listen(listenfd,backlog) connfd = accept(listenfd,...) // 阻塞 read(conn

2017-06-28 23:17:10 1554

原创 IO复用

概念:多路网络连接复用一个IO线程。如果用监控来自10根不同地方的水管(I/O端口)是否有水流到达(即是否可读),那么需要10个人(即10个线程或10处代码)来做这件事。如果利用某种技术(比如摄像头)把这10根水管的状态情况统一传达到某一点,那么就只需要1个人在那个点进行监控就行了。由于I/O多路复用是在单一进程的上下文中的,因此每个逻辑流程都能访问该进程的全部地址空间,所以开销比多进程低得多;缺...

2017-06-28 12:56:34 646

原创 socket编程——TCP

函数流程框图: 创建: int  socket(int  domain,int  type,int  protocol); domain——>协议域: AF_INET————IPV4。 AF_INET6————IPV6。 AF_LOCAL————Unix域。 type——>类型: SOCK_STREAM——流式套接字,TCP协议支持该套接字(提供面向连接,可靠的数据传输服务

2017-06-15 15:00:14 674

原创 socket接口转换操作(网络序与主机序)

字节序转换操作: 头文件: 网络序转主机序: unit 16_t  ntohs(unit16_t  net_short); network  to  host  short。 把unsigned  short类型从网络序转换到主机序。 unit 32_t  ntohs(unit32_t  net_long); network  to  host  long。 把unsign

2017-06-14 23:01:16 1808

原创 线程间的读写锁

共享独占: 读取锁——共享 写入锁——独占 即:读锁可以加多个;有写锁时,读写锁都加不上;有读锁时,可以加读锁而不能加写锁。 静态分配读写锁: pthread_rwlock_t  rwlock = PTHREAD_RWLOCK_INITIALIZER; 动态分配读写锁: pthread_rwlock_init(&rwlock,NULL); pthread_rwlock_destro

2017-06-08 11:46:40 459

原创 线程间的互斥量和条件变量

互斥锁: PS:互斥锁的生存周期必须大于用到互斥锁的线程的生存周期! 静态分配互斥量: pthread_mutex_t  mutex=PTHREAD_MUTEX_INITIALIZER; 动态分配互斥量: pthread_mutex_init(&mutex,NULL); pthread_mutex_destroy(&mutex); mutex————互斥锁。 加锁: int pt

2017-06-08 11:18:32 390

原创 线程的信号量

创建: int  sem_init(sem_t* sem,int pshared,unsigned  int  value); sem————信号量对象。 pshared——信号量类型:0为线程共享; value———初始值。 返回值———0成功,-1失败。 销毁: int sem_destroy(sem_t*  sem); 返回值————0成功,-1失败。 阻塞等待: int

2017-06-08 10:45:58 513

原创 多线程编程

概念: 进程内的一个执行单元,执行的一段程序片段。共享全局变量。(和主函数同时执行的子函数就是一个线程)(hello world程序,可以说是一个进程,也可以说是一个线程)。 参考手册: man  7  threads 查看线程: 命令: ps  -T  -p  ————查看该pid的线程 top  -H  -p  ————开启线程查看 htop——设置:F2(开启“树状视图”查看

2017-06-01 17:18:07 337

原创 读写锁

作用: (实现文件的读写同步)当一个进程正在读或修改文件的某个部分时,阻止其他进程修改同一文件区。 访问操作: 写入锁——又叫排它锁 读取锁——又叫共享锁 多进程访问 (同一个进程访问只会覆盖已有的锁) 已存在锁 读取锁 写入锁 无 OK OK 读取锁 OK NG 写入锁 NG NG 同一个进程访问只会覆盖已有的锁在访问之前尝试加锁可以知道文件是否正在被读写。 加锁区域: 文件锁—

2017-06-01 14:35:05 582

原创 systemV信号量

头文件: sys/sem.h 查看: ipcs 信号量获取: int  semget(key,nsems,semflg); key: 命名信号量。 IPC_PRIVATE 和 ftok()两种方式。 nsems: 信号量数目。 非0——新建的信号量的数量。 0———获取信号量(打开时填0) semflg: IPC_CREAT————————创建信号量,已存在时不出错(创

2017-05-24 17:12:56 470

原创 posix信号量

头文件: semaphore.h 库: -pthread 查看: ls /dev/shm/(所有名字前面都自动加上了sem.) man sem_overview 命名信号量(基于文件): 创建: sem_t* sem_open(const char* name,int oflag,mode_t mode,unsigned int value); name: 信号量IPC名字。

2017-05-24 13:23:14 401

原创 信号量

分类: 二值信号量——0和1 计数信号量——0和n 作用: 控制多进程共享资源的访问 P操作: 0——挂起进程 >0——减一 V操作: 0——恢复进程 >0——加一 本质: 任意时刻只能有一个进程访问临界区(代码)

2017-05-24 13:21:35 293

原创 system V 共享内存

头文件: sys/shm.h 查看: ipcs 共享内存获取: int shmget(key_t key,size_t size,int shmflg); key: IPC_PRIVATE——亲缘间 ftok———————非亲缘间 size: 内存容量: 非0——新建的共享内存大小 0———获取共享内存 shmflg: IPC_CREAT IPC_CREAT|IPC_

2017-05-24 11:22:28 1079

原创 POSIX共享内存(内存映射)

本质: 两个进程访问同一个逻辑内存; 直接访问内存,不用read()/write(),非常方便。 匿名映射文件: 设备 作用 举例 /dev/zero 永远输出0的设备文件 dd if=/dev/zero of=磁盘分区 count=1024 bs=1024 /dev/null 丢弃一切写入其中数据 cat test > /d

2017-05-24 10:18:31 770

原创 system V 消息队列(msg)

头文件: sys/msg.h 查看: ipcs命令 结构体: 自定义消息缓冲区结构msgbuf: mtype: 消息类型(必须是long型;必须是结构体第一个变量)。 mtext: 消息数据(可以随意定义)。 例子: struct msgbuf{       long mtype;/* must > 0 */       char mtext;/* dat

2017-05-18 10:11:02 1945

原创 POSIX消息队列(mq_)

头文件: mqueue.h 库: rt--------librt.so 编译的时候加-lrt 查看POSIX消息队列所有函数: man mq_overview 结构体: struct mq_attr{ mq_flags; ——标志: ————在mq_open时被初始化; ————在mq_setattr中设置; ————其值为0(阻塞)或者O_NONBLOCK(非阻塞)。

2017-05-17 17:29:48 8119

原创 用管道或套接字实现客户端服务器模型

图示模型:           主要步骤: 1.客户端获取文件路径,发送到服务器。 2.服务器接收到文件路径,并且读取到文件内容,在发送回客户端。 3.客户端接收文件内容,并显示到控制台。 代码: 使用两个FIFO实现客户服务器模型: client: #include #include #include #include #include #in

2017-05-17 15:05:55 606

转载 进程间通信时读写阻塞的条件

匿名管道(pipe,dup,popen)和套接字(socketpair)中的读写操作: 只能亲缘间实现通信 命名管道(fifo)中的读写操作: 建立管道文件,通过管道文件进行通信。可实现非亲缘间的通信。

2017-05-16 19:22:21 1073

原创 套接字(全双工)实现进程间通信

特点: sv【0】和sv【1】可读可写。每个进程固定用一个接口。 写数据时:通道不满不阻塞; 读数据时:通道里没数据时阻塞。可用fcntl设置为非阻塞。 创建: int socketpair(int domain, int type, int protocol, int sv【2】); 参数: domain: 套接口的域: AF_LOCAL--------现在用法 AF_UNI

2017-05-16 19:09:42 1508

原创 Linux中在终端捕获程序的返回值(return 0和exit(0))

在程序运行结束后,在终端(shell界面)上输入命令: echo  $? 显示的即为上一个程序结束时的返回值(return 1,exit(2),_exit(12)都可以,abort退出时,返回值为随机数)。 功能: 可以判断上一个程序时在什么情况下结束的: 正常情况下,返回值为0即为正常退出;为1或-1为错误终止退出。也可以自己设置值。 代码: #include int main

2017-05-12 23:04:38 10980

转载 Linux中字符串转整形数字的函数

Linux内核中提供的一些字符串转换函数: lib/vsprintf.c 1. unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base) 2. unsigned long simple_strtoul(const char *cp, char **endp, un

2017-05-12 15:59:50 4077

原创 getopt()函数(分析命令行参数)

头文件: #include 函数形式: int getopt(int argc, char* argv【】, const char* optstring); 功能: getopt直接分析命令行参数,找到选项和选项参数以及操作数的准确位置。 参数: optstring: optstring里存放需要识别的选项字符(如果该选项有参数,则后面加冒号)。 argc: 命令行字符串个数

2017-05-12 14:43:36 871

转载 Linux中常用操作命令

Linux简介及Ubuntu安装 Linux,免费开源,多用户多任务系统。基于Linux有多个版本的衍生。RedHat、Ubuntu、Debianaa 安装VMware或VirtualBox虚拟机。具体安装步骤,找百度。 再安装Ubuntu。具体安装步骤,找百度。 安装完后,可以看到Linux系统的目录结构,见链接http://www.weixuehao.com/archives/492

2017-05-12 14:15:54 286

原创 FIFO管道/命名管道(半双工)

特点: 可以是非亲缘进程之间; 读写必须同时进行,否则阻塞。 创建命名管道: int mkfifo(pathname,mode); 参数: pathname: 文件路径(文件必须不存在)。 mode: 模式。 返回值: 0 成功 非0 失败 创建FIFO管道代码: #include #include #include #include int main()

2017-05-12 11:41:14 1633

原创 匿名管道 与 命名管道/FIFO管道 的特点

匿名管道: 必须是亲缘进程之间。 写不会阻塞;读会阻塞。 命名管道: 可以是非亲缘进程之间。 读写必须同时执行,否则阻塞。

2017-05-12 11:39:36 882

GDB调试命令手册

用GDB调试可以快速的找到编译代码中的错误,更可以清晰地看到电脑运行代码的全过程。更方便学习和修改代码

2017-05-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除