memset函数

C++STL库String类实现

巧了我就是萌 提交于 2020-01-13 14:50:11
前言:按照源码中String类的设计方式实现简单的写了一个myString,参考 C++官网中的标准stringAPI 完成几乎所有的String类的方法,尽量与源码实现风格类似,有部分没实现有的功能之间相似度较高,重复工作意义不大就没写,有的是没办法写。 亲自在我写的数据结构课设哈弗曼树中使用,没有出现特殊问题,自己测试也没有出问题,如果哪里有错希望大家可以给我指出来。 (一) 关于扩容 在开始写的时候我先查阅相关资料和源码,对与String的扩容,我发现在源码中String的实现里,它预先会有一个16字节的在栈区的缓冲区,如果你的String对象不到16字节,则不会申请堆区内存使用这部分栈区内存,在所占内存较小的情况下,直接使用栈区内存的会增强运行效率,提高CPU cache命中率,而当你使用的string类占据内存过大时,据我查我的系统(Deepin 15.10.1),默认栈内存只开辟8192KB。 如果String类对象所占内存过大,很有可能程序直接爆栈,所以,在字符串内存高于16字节时,会开辟堆区内存,在源码中,为了节省空间,在这里使用了一个联合体,下面是该联合体结构。 我自己模拟的结构 enum { BUF_LEN = 16 } ; union _Bxty { char _Buf [ BUF_LEN ] ; char * _ptr ; } _Bx ; 在扩容的时候

二分图最大匹配

a 夏天 提交于 2019-12-24 01:13:51
HDU 1150: http://acm.hdu.edu.cn/showproblem.php?pid=1150   最小覆盖点 == 最大匹配数( 选取最少的点数,使这些点和所有的边都有关联——把所有的边的覆盖 ) 两台机器,有n和m个工作模式,起始工作模式都为0,现在有k件工作,第i件工作可分别在两个机器上用各自的模式工作,但换模式要重启,问重启的最小次数。 写的时候因为是找二分最大匹配的题目时找到写的,想到了二分上去,也知道是求最小覆盖点 == 最大匹配数,但不是很能理解,先把代码写了再说。 写的时候注意起始模式是0,所以换模式时把0的排除再外。(因为这个原因错了很多次) 一:邻接阵做法 代码 #include<iostream>using namespace std;int n,m,k;int map[105][105]; //记录X,Y对应点可否连接int vis[105]; //每次找增广路时对Y中点是否访问int dir[105]; //Y中点匹配的X中点的位置int find(int a){ int i; for(i=0;i<m;i++) { if(map[a][i]==1 && vis[i] == 0) { vis[i] = 1; if(dir[i] == -1 || find(dir[i])) { dir[i] = a; return 1; } } }

memcpy/memset函数的c语言实现

核能气质少年 提交于 2019-12-08 17:24:44
1、memcpy 头文件:#include <string.h> 函数原型:void *memcpy(void *dest, const void *src, size_t n) 功能:将指针src指向的内存空间的n个字节复制到dest指针指向的内存空间 参数:src 为原内容内存的起始地址,dest为复制到目标地址的起始地址 返回值:目标dest内存的起始地址 注意:1、 内存空间不能够有重叠; 2、 memcpy对于需要复制的内容没有限制,因此用途更广; 3、很明确的是memcpy是将 n个字节, 虽然memcpy对复制的内容完全没有任何的限制,比如数组,结构体等特殊的结构,如果你想将整个结构体变量的内容复制到dest内存区,最好使用sizeof将要复制的内容的完整大小求出来赋值给n,以保持复制的完整性; c代码: void *memCpy(void *dest, const void *src, size_t n) { if (NULL == dest || NULL == src || n < 0) return NULL; char *tempDest = (char *)dest; char *tempSrc = (char *)src; while (n-- > 0) *tempDest++ = *tempSrc++; return dest; } 2、memset

内存操作函数memcpy memmove memset memcmp

我的梦境 提交于 2019-12-07 09:12:58
1.memcpy void * memcpy ( void * dest, const void * src, size_t num ) (1)函数memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置。 (2)这个函数在遇到’\0’ 的时候并不会停下来。 (3)如果src和dest有任何的重叠,复制的结果都是未定义的 。 void *my_memcpy(void *dest, const void *src, size_t num) { char *str1 = (char *)dest;//应为此函数要将src的n个字节copy给dest char *str2 = (char *)src;//所以先强转为char* assert(dest != NULL && src != NULL);//使用assert断言,防止传空指针 while (num--) { *str1++ = *str2++;//切记不能把此条语句放入while()中,其他类型强转成char* }//时之间可能会存有'\0'的字节,会导致while的结束 return dest; } int main() { int ar[10] = { 1, 2, 3, 4 }; int ar2[10]; my_memcpy(ar2, ar, 4); printf("%d %d\n", ar2[0],

C语言实现FTP服务器

微笑、不失礼 提交于 2019-12-05 15:20:26
公共部分代码 /* common.h */ #ifndef COMMON_H #define COMMON_H #include <arpa/inet.h> #include <ctype.h> #include <dirent.h> #include <errno.h> #include <fcntl.h> #include <netdb.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #define DEBUG 1 #define MAXSIZE 512 #define CLIENT_PORT_ID 30020 struct command { char arg[255]; char code[5]; }; int socket_create(int port); int socket_accept(int sock_listen); int socket_connect(int port, char *host); int recv_data(int sockfd, char*

「题解」kuangbin 最小生成树

半世苍凉 提交于 2019-12-01 21:55:29
POJ-1251 Jungle Roads (水题,%c) POJ-1287 Networking (水) POJ-2031 Building a Space Station (%f浮点数尴尬精度,两球间距离) POJ-2421 Constructing Roads (一些边已建好,简单处理一下) ZOJ-1586 QS Network (处理一下边权) HDU-1233 还是畅通工程 (水) HDU-1875 畅通工程再续 (浮点数,条件连边) HDU-1301 Jungle Roads (重复 -> POJ-1251) POJ-2349 Arctic Network (第 K 大边) POJ-1751 Highways (求最小生成树的边,加 0 权边) UVA-10147 Highways (多组的 POJ-1751) + POJ-1258 Agri-Net (水) POJ-3026 Borg Maze (BFS + Kruskal,用最短路建图,垃圾输入) POJ-1789 Truck History (Prim,Kruskal 超时) POJ-1679 The Unique MST (次小生成树) 代码最后附简单题解 模板 Kruskal

区间DP复习

允我心安 提交于 2019-11-30 19:21:09
区间DP复习 (难度排序:(A,B),(F,G,E,D,H,I,K),(C),(J,L)) 这是一个基本全在bzoj上的复习专题 没有什么可以说的,都是一些基本的dp思想 A [BZOJ1996] [Hnoi2010] chorus 合唱队 裸题 \(dp[i][j][2]\) 表示区间 \(i,j\) 最后放的是 \(i\) 还是 \(j\) 的方案数 int n; int a[N]; ll dp[N][N][2]; int main(){ rep(i,1,n=rd()) a[i]=rd(); rep(i,1,n) dp[i][i][0]=1; drep(i,n,1) rep(j,i,n) rep(k,0,1) { if(k==0) { if(i>1 && a[i-1]<a[i]) (dp[i-1][j][0]+=dp[i][j][k])%=P; if(j<n && a[j+1]>a[i]) (dp[i][j+1][1]+=dp[i][j][k])%=P; } else { if(i>1 && a[i-1]<a[j]) (dp[i-1][j][0]+=dp[i][j][k])%=P; if(j<n && a[j+1]>a[j]) (dp[i][j+1][1]+=dp[i][j][k])%=P; } } cout<<(dp[1][n][0]+dp[1][n][1])%P<<endl

AC自动机总结

孤街醉人 提交于 2019-11-29 19:47:14
AC自动机总结 AC自动机简述 功能 多模板串对单个或多个串的匹配问题 主体思想 原理同 \(kmp\) , 在 \(trie\) 树上使用变种的 \(kmp\) 实现 需要数组 : \(trie[N][26],fail[N]\) \(fail\) 即我们所说的失配函数, \(trie[]\) 则略有变更 准确一点得说, \(fail\) 函数是不需要知道后继字母的失配 而 \(trie\) 树上的节点经过处理后,就可以直接 \(O(1)\) 访问后继每一种字母的情况的下一个位置,不需要再一次次失配 预处理 AC自动机的预处理与 \(kmp\) 的预处理只有一点不同 \(kmp\) 的 失配数组 \(nxt[N]\) , 是在不知道下一位的字母,一次次失配直到与下一位匹配 int j=0; for(int i=1;i<=n;++i){ while(j && s[i]!=t[j+1]) j=nxt[j]; if(s[i]==t[j+1]) j++; } 然而AC自动机既然已经基于 \(trie\) 树结构,自然可以对于每个下一位字母的情况来匹配,这里我们分类讨论 ​ 如果已经存在同字母的节点,那么就是下一位节点,而它的 \(fail\) 就是上一个失配位置 \(fail\) 的这一个字母的后继节点 ​ 如果不存在,就是上一个失配位置 \(fail\) 的这一个字母的后继节点 (

Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)

断了今生、忘了曾经 提交于 2019-11-29 07:09:07
二进制专场,还被FST一题。 A、签到,题意是,给定a,b,c f(0)=a,f(1)=b,f(n)=f(n-1)^f(n-2) 求f(n) 稍微化简就看得出f(x)是按照a,b,a^b这样在循环出现 因为a^b^a=b,a^b^b=a 代码: #include <bits/stdc++.h> #define int long long #define sc(a) scanf("%lld",&a) #define scc(a,b) scanf("%lld %lld",&a,&b) #define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c) #define schar(a) scanf("%c",&a) #define pr(a) printf("%lld",a) #define fo(i,a,b) for(int i=a;i<b;++i) #define re(i,a,b) for(int i=a;i<=b;++i) #define rfo(i,a,b) for(int i=a;i>b;--i) #define rre(i,a,b) for(int i=a;i>=b;--i) #define prn() printf("\n") #define prs() printf(" ") #define mkp make_pair

[算法模版]AC自动机

邮差的信 提交于 2019-11-28 12:22:29
[算法模版]AC自动机 基础内容 板子不再赘述, OI-WIKI 有详细讲解。 \(query\) 函数则是遍历文本串的所有位置,在文本串的每个位置都沿着 \(fail\) 跳到根,将沿途所有元素答案++。意义在于累计所有以当前字符为结尾的所有模式串的答案。看代码就能很容易的理解。 另外 \(e[i]\) 记录的是第 \(t\) 个模式串结尾是哪个节点(所有节点均有唯一的编号)。 贴个 P5357 【模板】AC自动机(二次加强版) 板子: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<vector> #define maxn (int)(2e6+10000) int ch[(int)(2e5+1000)][30],fail[maxn],cnt,e[maxn],nex[maxn],n,queue[maxn],ans[maxn]; using namespace std; char s[(int)(2e6+1)]; char data[maxn]; void init() { memset(ch,0,sizeof(ch)); memset(fail,0,sizeof(fail)); memset(e,0,sizeof(e));