sizeof

【数据结构与算法】二叉树的遍历

让人想犯罪 __ 提交于 2020-01-28 09:52:48
前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。 层次遍历是指,对树中的节点一层一层的打印,其实就是广度优先算法(BFS)。 一、前序遍历 LeetCode: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ C语言代码实现: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * struct TreeNode *left; 6 * struct TreeNode *right; 7 * }; 8 */ 9 10 11 /** 12 * Note: The returned array must be malloced, assume caller calls free(). 13 */ 14 15 /* 获取树的节点个数 */ 16 int getTreeNodeLen(struct TreeNode* root) 17 { 18 if (root

高并发多路IO之select,poll和epoll模型区别与代码实现

≡放荡痞女 提交于 2020-01-28 07:53:34
多路IO之select 优点:单进程下支持高并发,可以跨平台 缺点:多次从内核到应用,应用到内核的数组拷贝;    每次内核都会重置填写的数据    最大支持1024客户端,原因在于fd_set定义使用了FD_SETSIZE,大小为1024; 以下是select模型server代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <errno.h> #include <fcntl.h> #include <sys/select.h> #include <ctype.h> int main(){ int lfd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in serv; bzero(&serv,sizeof(serv)); serv.sin_port = htons(8888); serv.sin_family = AF_INET; serv.sin_addr.s_addr

ac自动机

安稳与你 提交于 2020-01-28 03:46:28
https://www.cnblogs.com/sclbgw7/p/9875671.html 讲的好的博客。 只有fail指针的模板,好像用不到,一般都是用last指针的模板。 void build() { queue<int>q; q.push(1); while(!q.empty()) { int x=q.front();q.pop(); for(int i=0;i<26;++i) { int c=ch[x][i]; if(!c){ch[x][i]=ch[fail[x]][i];continue;}//关键,把子节点改成fail节点的子节点 q.push(c); int fa=fail[x]; while(fa&&!ch[fa][i])fa=fail[fa]; fail[c]=ch[fa][i]; } } } https://cn.vjudge.net/contest/301351#problem/A 习题 最基础的模板,即求一个文本串有多少个匹配的模式串。 #include<queue> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 5e5 + 5; const int N = 1e6 + 5; int tree[maxn][27];

cpp中sizeof的总结

南楼画角 提交于 2020-01-28 02:08:23
测量普通变量 被测量 value char 1 short 2 int 4 double 8 数组 数组内容个数+1(结尾有“\0”) 传入函数的数组 4,是一个指针,指向这个数组 测量类对象 被测量 value 空 1 char 1,字节对齐 short 2,字节对齐 int 4,字节对齐 double 8,字节对齐 普通函数 不占字节 几个虚函数 有一个指向虚函数表的指针,只占用一个指针,32位机器是4 静态成员变量 不占字节,共享同一个静态存储区,不在每一个实例中 一次虚拟继承 4,指向父类指针 测量联合体union 两点原则: 1. 等于占用空间最大的一个成员的大小; 2. 最大值需要字节对齐,等于最小成员的倍数 被测量 value 空 1 char 1 char[13] 13 short 2 int 4,字节对齐,安照union里面最小字节的倍数来对齐。 double 8,字节对齐,安装union里面最小字节的倍数来对齐。 参考推荐 参考来自《c++程序员面试秘笈》面试题13到面试题20。 关于计算机内存 什么是代码区、常量区、静态区(全局区)、堆区、栈区 ,很好的一个博客推荐: https://blog.csdn.net/u014470361/article/details/79297601 来源: CSDN 作者: dgi_ 链接: https://blog.csdn

IO多路复用之epoll总结

最后都变了- 提交于 2020-01-27 03:05:52
除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #define STDIN 0 // file descriptor for standard input int main(void) { struct timeval tv; fd_set readfds; tv.tv_sec = 2; tv.tv_usec = 500000; FD_ZERO(&readfds); FD_SET(STDIN, &readfds); // don't care about writefds and exceptfds: select(STDIN+1, &readfds, NULL, NULL, &tv); if (FD_ISSET(STDIN, &readfds)) printf("A key was pressed!\n"); else printf("Timed out.\n"); return 0; } select、poll、epoll之间的区别总结[整理] select,poll

有上下界的网络流问题

不羁岁月 提交于 2020-01-26 20:53:16
有上下界的网络流问题分为无源汇和有源汇两种。 根据周源的《 一种简易的方法求解流量有上下界的网络中网络流问题》 无源汇上下界网络流 的做法是: 设边u->v的下界是B(u,v),上界是C(u,v)。 设M(i)为对于i结点的流入i的下界总和-流出i的下界总和。 增设源点s和汇点t。 如果M(i)>=0 连边s->i,容量为M(i)。 如果M(i)<0 连边i->t,容量为-M(i)。 对于图中的原来的边u-v,连边u->v,容量为C(u,v)-B(u,v)。 然后求最大流。如果对于源点出发的所有边都满流,则说明存在一个可行流满足条件。 有源汇有上下界网络流 的具体做法是: 1.求可行流 从汇点到源点连一条边,容量为INF,其他与无源汇有上下界网络流的建图方法相同。然后以超级源点和超级汇点为网络流的源和汇求一次最大流。 判断起始于超级源点的边是否全部满流即可。 2.求最大流 从汇点到源点连一条边,容量为INF,其他与无源汇有上下界网络流的建图方法相同。然后以超级源点和超级汇点为网络流的源和汇求一次最大流。 判断起始于超级源点的边是否全部满流,若满流,说明存在可行流。 然后去掉汇点到源点连的边,在原来的基础上以原图中的源点和汇点为网络流的源和汇再求一次最大流即可。 ZOJ 2314 Reactor Cooling 无源汇有上下界求最大流 题目链接: http://acm.zju.edu

网络通信: TCP与UDP协议

落爺英雄遲暮 提交于 2020-01-26 15:00:21
主要参考: c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码 ; UDP协议的详细解析 ; TCP 详解 文章目录 网络编程和套接字 消息接收过程 消息发送过程 UDP协议 简介 代码实现 TCP协议 简介 代码实现 网络编程和套接字 网络编程 是编写程序使两台 联网的 计算机相互交换数据, 主要依靠操作系统提供的“套接字”部件. 套接字 是用于网络数据传输的软件设备, 如果将网络通信类比为电话机通信系统,那套接字就是电话机, 渠道就是互联网, 和电话拨打或接听一样,套接字也可以发送或接收. 消息接收过程 先有一台电话机: 创建套接字, 即 实例化 int socket(int domain, int type, int protocol); 电话机要有电话号码的问题: 给套接字 绑定 地址信息(IP地址和端口号) int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); 设置电话机为可接听状态: 设置套接字为 可接听 状态 int listen(int sockfd, int backlog); 接听电话: 套接字 接受 消息 int accept(int sockfd, struct sockaddr *addr, socklen_t

C++基础内容复习

陌路散爱 提交于 2020-01-26 09:50:31
下列语句定义了5个变量: int count; double sales_price,sum; std::string title; Sales_item bookItem; 每个定义都是以 类型说明符 开始,如上int、double、std::string、Sales_item都是类型名,其中int和doubleshi是 内置类型 ,std::string是 标准库定义的类型 (需要#include <string>), Sales_item是 自定义类型 。 ::作用域操作符,含义是右操作符的名字可以在左操作数的作用域中找到 简化std::string 的写法是使用using。 比如使用using std::string; using std:cin;之后,在下面的代码中就可以直接使用string和cin了。 当进行string对象和字符串字面量混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的。 比如,如下s1的初始化时正确的 string item ="what a mess!"; string s1 =item +","; 但是:string s1 ="what a mess!" +","; 就会报错,这个和C#是 完全不一样 的。 虽然任何整数数值都可以作为索引,但是索引的实际数据类型却是unsigned类型的string::size_type

如何求C语言字符串长度(strlen函数和sizeof关键字)

放肆的年华 提交于 2020-01-26 04:20:23
C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项。 C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度。 在程序里,一般会用strlen()函数或sizeof来获取一个字符串的长度,但这2种方法获取的字符串的长度其实是不一样,我们用如下函数进行测试: void test6() { char s1[20] = “hello world”; char s2[20] = {‘h’,‘e’,‘l’,‘l’,‘0’,’ ‘,‘w’,‘o’,‘r’,‘l’,‘d’,’\0’}; char s3[] = “hello\0 world”; char s4[] = {‘h’,‘e’,‘l’,‘l’,‘0’,’\0’,’ ‘,‘w’,‘o’,‘r’,‘l’,‘d’,’\0’}; printf("%d\t%d\t%d\t%d\n",strlen(s1),strlen(s2),strlen(s3),strlen(s4)); printf("%d\t%d\t%d\t%d\n",sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4)); } 注意,该函数里面定义了4个字符串,基本数据都是“hello world",但需要注意的是,字符串s1和s2给定了字符串数组的大小为20,然后使用2种方式进行赋值

memset函数用法

折月煮酒 提交于 2020-01-26 01:53:29
1. memset()函数原型是extern void *memset(void *buffer, int c, int count)   buffer:为指针或是数组   c:是赋给buffer的值 count:是buffer的长度 这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer)), Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’; 例:char a[100];memset(a, '/0', sizeof(a)); memset可以方便的清空一个结构类型的变量或数组。 如: struct sample_struct {   char csName[16];   int iSeq;   int iType; }; 对于变量:struct sample_struct stTest; 一般情况下,清空stTest的方法: stTest.csName[0]='/0'; stTest.iSeq=0; stTest.iType=0; 用memset就非常方便: memset(&stTest,0,sizeof(struct sample_struct)); 如果是数组: struct sample_struct TEST[10]; 则 memset(TEST,0