首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多层Vector指针套嵌与调用有关问题

2012-03-31 
多层Vector指针套嵌与调用问题如题,因为一个算法解决需要,设计以下算法,肯定存在许多错误,设计目的如下:st

多层Vector指针套嵌与调用问题
如题,因为一个算法解决需要,设计以下算法,肯定存在许多错误,设计目的如下:

 struct P3DNode //结构体
{  
  int level;
  int PointNum; 
  vector PointID(10);
 }; 
  vector <P3DNode> SpTreeZ; //包含P3DNode结构体vector
  vector < SpTreeZ *> SpTreeY; // 包含SpTreeZ指针的vector
  vector < SpTreeY *> SpTreeX; // 包含SpTreeY指针的vector

//******使用方法:
//1、逐层赋值:
  P3DNode PointTmp;
  PointTmp.level=3;

//2、vector赋值
  for(int i=0;i<10;i++)
  { 
  PointTmp.level=i;
  SpTreeZ.push_back(PointTmp);
  }
  SpTreeY.push_back(&SpTreeZ);
  SpTreeX.push_back(&SpTreeY[0]);


//使用第二个结构体的level值
  int TestData=SpTreeX[0]->SpTreeY[0]->SpTreeZ[1].Level;


以上哪些地方错误,请指正,以便达到以上目的;

[解决办法]
int TestData=SpTreeX[0]->SpTreeY[0]->SpTreeZ[1].Level;

有误

SpTreeX[0]是SpTreeY *指针变量,怎么能->SpTreeY[0]?
后面一样是这样的错误


另外,vector创造会构造相关变量,它内部申请新空间是它的事情,和外面的没关系
[解决办法]

探讨

补充问题:
1、 引用:STL中说过,当vector在添加新元素时,如果空间已经不足以保存新元素,则开辟一块新的空间,并把之前内容复制到新的空间中去。因此,当如vector SpTreeZ开辟新空间后,vector < SpTreeZ *> SpTreeY是否会失效??
2、若改为引用呢?如下:
vector <P3DNode> SpTreeZ; //包含P3DNode结构体vec……

[解决办法]
vector < SpTreeZ *>容器中 存储的是指针,复制起来比引用块的很多,而且这个VECTOR工作效率主要还是跟其成员类有关, 每次拷贝都要析构一次,这样才使得效率变低。

这句话什么意思,解释一下,好不

vector在一个类中,作为这个类的成员对象, 

为什么每次拷贝都要析构??
[解决办法]
多层vector不如多维数组简单。比如:
C/C++ code
//在堆中开辟一个2×3×4×5的4维int数组#include <stdio.h>#include <malloc.h>int ****p;int h,i,j,k;void main() {    p=(int ****)malloc(2*sizeof(int ***));    if (NULL==p) return;    for (h=0;h<2;h++) {        p[h]=(int ***)malloc(3*sizeof(int **));        if (NULL==p[h]) return;        for (i=0;i<3;i++) {            p[h][i]=(int **)malloc(4*sizeof(int *));            if (NULL==p[h][i]) return;            for (j=0;j<4;j++) {                p[h][i][j]=(int *)malloc(5*sizeof(int));                if (NULL==p[h][i][j]) return;            }        }    }    for (h=0;h<2;h++) {        for (i=0;i<3;i++) {            for (j=0;j<4;j++) {                for (k=0;k<5;k++) {                    p[h][i][j][k]=h*60+i*20+j*5+k;                }            }        }    }    for (h=0;h<2;h++) {        for (i=0;i<3;i++) {            for (j=0;j<4;j++) {                for (k=0;k<5;k++) {                    printf(" %3d",p[h][i][j][k]);                }                printf("\n");            }            printf("--------------------\n");        }        printf("=======================\n");    }    for (h=0;h<2;h++) {        for (i=0;i<3;i++) {            for (j=0;j<4;j++) {                free(p[h][i][j]);            }            free(p[h][i]);        }        free(p[h]);    }    free(p);}//   0   1   2   3   4//   5   6   7   8   9//  10  11  12  13  14//  15  16  17  18  19//--------------------//  20  21  22  23  24//  25  26  27  28  29//  30  31  32  33  34//  35  36  37  38  39//--------------------//  40  41  42  43  44//  45  46  47  48  49//  50  51  52  53  54//  55  56  57  58  59//--------------------//=======================//  60  61  62  63  64//  65  66  67  68  69//  70  71  72  73  74//  75  76  77  78  79//--------------------//  80  81  82  83  84//  85  86  87  88  89//  90  91  92  93  94//  95  96  97  98  99//--------------------// 100 101 102 103 104// 105 106 107 108 109// 110 111 112 113 114// 115 116 117 118 119//--------------------//=======================// 

热点排行