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++技术网是你学习的坚强后盾。每一个解答绝不局限于你问题答案本身,会尽量全面分析和回答以及延伸,帮助你全面的了解学习。