当前位置:C++技术网 > 资讯 > 向量改动态数组的问题

向量改动态数组的问题

更新时间:2016-08-08 09:51:21浏览次数:1+次

vector< CPoint > points ;
for (int x = 0; x < numPoints; x++)
{
  for (int i = 0; i < 10; i++)
   points.push_back( ((float)x + 0.1*i, (float)x + 0.1*i);

}

修改为:

double *XValues = new double[numPoints];    
double *YValues = new double[numPoints];
for (int x = 0; x < numPoints; x++)
{
   for (int i = 0; i < 10; i++)
   {
    XValues[x] = (float)x + 0.1*i;
    YValues[x] = (float)x + 0.1*i;
    }  
}    结果 向量里面保存了所有的数,而动态数组 值保存了几个?这里动态数组改怎么表达才对?


C++技术网解答:

vector组使用中,索引的个数为:x*i = numPoints * 10
分别为:
x=0,i=0;
x=0,i=1;
x=0,i=2;
......
x=0,i=9;
x=1,i=0;
......
x=numPoints,i=9;

而动态创建的数组的索引个数为:x = numPoints

所以,动态数组自然就没有存储所有的值。

问题在于:
动态数组元素总数就不达标!改成动态数组后,单个数组要存储所有的点,这个点数没有正确。还有循环计数没有处理好。这个是容易产生混淆的地方。

分析:
    在vector中,决定元素个数的是在双循环的内部不停的push_back,这样元素的个数就是双循环的次数,也就是x*i = numPoints * 10。而在动态创建的数组的个数决定,是事先决定的。而且,是依据外层循环的次数来定的,自然也就少了很多次。
    双循环的遍历次数确实没有错,但是总计数却不够。现在的现象为:x的外层循环的值在内层循环中始终不变,这样也就是,XValues[x]的值被重复赋值了10次。不仅是少了数据,而且数据都是间隔赋值的。

改进建议:
    修改总计数,修改总计数的索引递增方式为双循环内部增加技术,不能依赖双循环一个的循环索引。所以改进代码如下:
int allPointCount=numPoints*10;
int allIndex=0;
double *XValues = new double[allPointCount];    
double *YValues = new double[allPointCount];
for (int x = 0; x < numPoints; x++)
{
   for (int i = 0; i < 10; i++)
   {
        XValues[allIndex] = (float)x + 0.1*i;
        YValues[allIndex] = (float)x + 0.1*i;
        allIndex++;
    }  
} 

   遇到循环的问题,冷静下来分析循环遍历的变化,对总次数和循环遍历的过程要理清楚。同时,尽量让循环索引和数组计数独立开,以免混在一起,最后懵逼了。

建议:

    既然作为点来处理数据,请使用结构体组织一个点的两个数据,而不是用两个数组。因为这两个数据是一个整体,不能脱离的。用两个数组就独立开来了,只有你刻意去组起来使用,才是两个点,其他人一开始很难知道你这么用。对于形式上应该组合在一起的数据,也就是几个数据是一个整体数据类型的一部分的,用结构体组合在一起。使用时方便,理解时容易。而且结构体使用也很简单。也就是你可以自己定义一个点结构体,代码如下:

struct POINT
{
    double x;
    double y;
};

     这样,你只需要创建一个POINT结构体数组,这样代码逻辑更加清楚了。再次改进后的代码如下:

int allPointCount=numPoints*10;
int allIndex=0;
POINT * pPoint = new POINT[allPointCount];    
for (int x = 0; x < numPoints; x++)
{
   for (int i = 0; i < 10; i++)
   {
        pPoint[allIndex].x = (float)x + 0.1*i;
        pPoint[allIndex].y = (float)x + 0.1*i;
        allIndex++;
    }  
} 
     加油吧。C++技术网是你学习的坚强后盾。每一个解答绝不局限于你问题答案本身,会尽量全面分析和回答以及延伸,帮助你全面的了解学习。