memcpy函数实现及其优化

void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。


方案一:没有考虑重复,不太好

void *mymemcpy(void *dst,const void *src,size_t num)
{
	assert((dst!=NULL)&&(src!=NULL));
          //assert(des>=src+num||src>dst+num);
	byte * psrc = (byte *)src;//byte 既为unsigned char类型
	byte * pdst = (byte *)dst;
	while(num-->0)*pdst++ = *psrc++;
	return dst;
}


方案二:考虑重复情况

代码中,无论谁在前在后,如果保证调用函数后,两个字符串都能用,就必须加上两个重复判断!

void* memcpy(void *dst, const void *src, size_t count)      
{      
    //安全检查  
    assert( (dst != NULL) && (src != NULL) );      
  
    unsigned char *pdst = (unsigned char *)dst;      
    const unsigned char *psrc = (const unsigned char *)src;      
  
    //防止内存重复  
    assert(!(psrc<=pdst && pdst<psrc+count));      
    assert(!(pdst<=psrc && psrc<pdst+count));      
  
    while(count--)      
    {      
        *pdst = *psrc;      
        pdst++;      
        psrc++;      
    }      
    return dst;      
}    


方案三:如果有重复,也会进行复制,但要注意,传入的指针是void类型的,一定要转换成char *类型!

void * mymemcpy(void *dest, const void *src, size_t count)
{
    if (dest == NULL || src == NULL)
          return NULL;
    char *pdest = static_cast <char*>(dest);
    const char *psrc  = static_cast <const char*>(psrc);
    int n = count;
    
    if (pdest > psrc && pdest < psrc+count)
    {
        for (size_t i=n-1; i != -1; --i)
        {
                pdest[i] = psrc[i];
        }
    }
    else
    {
        for (size_t i= 0; i < n; i++)
        {
                pdest[i] = psrc[i];
        }
    }
    
    return dest;
}


void * my_memcpy(void *dst,const void *src,unsigned int count)
{
     assert(dst);
     assert(src);
     void * ret = dst;
     if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝
	 {
		 while(count--)
		 {
			 *(char *)dst = *(char *)src;
			 dst = (char *)dst + 1;
			 src = (char *)src + 1;
		 }
	 }
	 else						//源地址和目的地址重叠,高字节向低字节拷贝
	 { 
		 dst = (char *)dst + count - 1;
		 src = (char *)src + count - 1; 
		 while(count--) 
		 {
			 *(char *)dst = *(char *)src;
			 dst = (char *)dst - 1;
			 src = (char *)src - 1;
		 }
    }
	return ret;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如前所述,哈密顿回路最短路径问题是一个NP难问题,目前没有找到多项式时间内解决的算法。因此,我们只能使用启发式算法来解决这个问题。 下面是使用遗传算法求解哈密顿回路最短路径问题的示例代码: ```c++ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <vector> #include <ctime> using namespace std; const int N = 20; //节点个数 const int M = 100; //种群大小 const int T = 10000; //迭代次数 int d[N][N]; //距离矩阵 int pop[M][N]; //种群 int fit[M]; //适应度 int tmp[N]; //临时数组 //初始化距离矩阵 void init() { srand(time(0)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j) { d[i][j] = 0; } else { d[i][j] = rand() % 100 + 1; } } } } //计算回路长度 int calc_len(int *p) { int len = 0; for (int i = 0; i < N; i++) { len += d[p[i]][p[(i+1)%N]]; } return len; } //计算适应度 void calc_fit() { for (int i = 0; i < M; i++) { fit[i] = calc_len(pop[i]); } } //选择 void select() { int tmp[M][N]; memcpy(tmp, pop, sizeof(pop)); for (int i = 0; i < M; i++) { int a = rand() % M; int b = rand() % M; if (fit[a] < fit[b]) { memcpy(pop[i], tmp[a], sizeof(tmp[a])); } else { memcpy(pop[i], tmp[b], sizeof(tmp[b])); } } } //交叉 void crossover() { int tmp[M][N]; memcpy(tmp, pop, sizeof(pop)); for (int i = 0; i < M; i += 2) { int a = rand() % M; int b = rand() % M; int k = rand() % (N-1) + 1; for (int j = 0; j < k; j++) { pop[i][j] = tmp[a][j]; pop[i+1][j] = tmp[b][j]; } for (int j = k; j < N; j++) { pop[i][j] = -1; pop[i+1][j] = -1; } int p1 = k, p2 = k; for (int j = 0; j < N; j++) { if (find(pop[i], pop[i]+N, tmp[b][j]) == pop[i]+N) { pop[i][p1++] = tmp[b][j]; } if (find(pop[i+1], pop[i+1]+N, tmp[a][j]) == pop[i+1]+N) { pop[i+1][p2++] = tmp[a][j]; } } } } //变异 void mutate() { for (int i = 0; i < M; i++) { if (rand() % 1000 < 10) { int a = rand() % N; int b = rand() % N; swap(pop[i][a], pop[i][b]); } } } //寻找最优解 int solve() { int best = 0; for (int t = 0; t < T; t++) { select(); crossover(); mutate(); calc_fit(); int idx = min_element(fit, fit+M) - fit; if (fit[idx] < fit[best]) { best = idx; } } return best; } //输出结果 void print(int idx) { printf("最短路径长度为:%d\n", fit[idx]); printf("最短路径为:"); for (int i = 0; i < N; i++) { printf("%d ", pop[idx][i]); } printf("\n"); } int main() { init(); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { pop[i][j] = j; } random_shuffle(pop[i]+1, pop[i]+N); } calc_fit(); int idx = solve(); print(idx); return 0; } ``` 在此示例代码中,我们使用了遗传算法来解决哈密顿回路最短路径问题。首先,我们初始化距离矩阵,并随机生成初始种群。然后,我们通过计算适应度函数来评估每个个体的优劣程度,并使用选择、交叉和变异等操作来逐步寻找最优解。最后,我们输出最优解的路径和长度。 需要注意的是,此代码仅供参考,实际应用时还需要根据具体问题进行调整和优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值