• 自定义序列化技术2:变长数组的实现


     1 //一维
     2 #include<iostream>
     3 #include<vector>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8  int len;
     9  cin>>len;
    10  vector<int> array(len);//声明变长数组
    11 
    12  for(int i=0;i<len;i++)
    13  {
    14   array[i]=i;
    15   cout<<array[i]<<"	";
    16  }
    17  return 0;
    18 }
    19 //二维
    20 #include <iostream>
    21 #include <iomanip>
    22 using namespace std;
    23 
    24 int main()
    25 {
    26  int num1,//行数
    27      num2;//列数
    28 
    29  cout<<"Please enter the number for row and column: "<<endl;
    30  cin >> num1 >> num2;
    31 
    32  //为二维数组开辟空间
    33  int **p = new int*[num1];
    34  for(int i=0; i<num1; ++i)
    35   p[i] = new int[num2];
    36 
    37  for(int j=0;j<num1;j++)
    38  {
    39   for(int k=0;k<num2;k++)
    40   {
    41    p[j][k]=(j+1)*(k+1);
    42    cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k];
    43   }
    44   cout<<endl;
    45  }
    46 
    47  //释放二维数组占用的空间
    48  for(int m=0;m<num1;m++)
    49   delete[] p[m];
    50  delete[] p;
    51 
    52  return 0;
    53 }

    调用C++里面的vector 容器,实现变长数组。

    why?  因为在用UDP进行数据通信的时候,我不可能把所有的点都发给决策组,那我就需要截取结构体里面的东西,该怎么截取,情况下面函数:

    方法一:(通过声明常量数组实现,截取部分)

    此种方法从理论上来讲与方法二有异曲同工之妙之妙,我们也也可以获得

     uint len = obs*sizeof(Point) + 2; 也就是matrix里面的大小。这样我们就没必要用sizeof(str);多此一举。
    但相比较方法二,此方法浪费空间比方法二要多,没有方法二灵活。
    1 char str[MAXSIZE+1];
     uint len = obs*sizeof(Point) + 2;
    2 memset(&str,0,sizeof(str)); 

    3 memcpy(&str,(char*)&matrix,len);//将matrix里面的值,赋值给str,长度sizeof。与上面刚好相反。

    方法二:

    1 /***************************UDP发送之前,将结构体转换为字符数组******************************/
    2   uint len = obs*sizeof(Point) + 2; 
    3   vector<char> str(len);       //声明可变数组 ,对于vector来说,vector本身就已经初始化了。不用在用memset()在初始化一遍了。
    4   // memset(&str,0,sizeof(str)); //初始化,赋值为0   
    5   memcpy(&str,(char*)&matrix,len);//从结构体matrix里面截取部分长度,并赋值给str数组。
    1  iSend=sendto(sClient,(char*)&str,len,0,(struct sockaddr*)&ser,iLen);//udp发送端函数

    至此,通过稀疏矩阵,将前方一个大的地图中有障碍物的坐标以及类型,通过稀疏矩阵编码,实际上就是一个结构体数组,然后将此结构体数组截取部分字段变为字符数组,并通过UDP传送过去。(注意:UPD通信,无所谓结构体或者结构体数组,其实直接强制类型转换即可。你可以结构体里面套结构体,但,最好标识非零点的个数,这样容易解包。然后,我们就可以通过所谓的强制类型转换即可。(char *)&buffer,buffer为一个字节数组,或者结构体,或者二维数组名,一维数组名都可以。

  • 相关阅读:
    [PKUSC2018]星际穿越——可持久化线段树+DP
    BZOJ2863[SHOI2012]魔法树——树链剖分+线段树
    BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
    BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
    树链剖分讲解及总结(重链剖分+长链剖分)
    Dubbo(3)--dubbo的源码分析
    Dubbo(1)--初识Dubbo
    zookeeper(5)--基于watcher原理实现带注册中心的RPC框架
    模板方法模式
    单例模式
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3516371.html
Copyright © 2020-2023  润新知