迭代向量时运行时错误

时间:2013-04-11 03:48:36

标签: c++

我正在迭代存储Point数据类型元素[x,y]的向量,而我想在每次迭代时实现的是添加前4个点x元素和前4个点y元素....下一次迭代我想对下一个4 x&是......等等

第一次迭代1.x + 2.x + 3.x + 4.x.                1.y + 2.y + 3.y + 4.y

第二次迭代5.x + 6.x + 7.x + 8.x.                5.y + 6.y + 7.y + 8.y

依旧.....................希望我的问题很清楚

示例代码:

double Pta; 
    double Ptb;
    Point  vect;
    float R1, R2;
    float resultant;
    vector<Point> vect_add;
    for(vector<Point>::iterator iter_a = Left_Arm_xy.begin()+1; iter_a != Left_Arm_xy.end(); ++iter_a)
    {

        if(center.y <= 240)
        {
            vect.x = iter_a->x - (iter_a -1)->x;
            vect.y = iter_a->y - (iter_a -1)->y;

            vect_add.push_back(Point(vect.x,vect.y));


            for(vector<Point>::iterator iter_v = vect_add.begin(); iter_v != vect_add.end(); ++iter_v)
            {



                    R1 = iter_v->x + (iter_v +1)->x + (iter_v +2)->x + (iter_v +3)->x;
                    R2 = iter_v->y + (iter_v +1)->y + (iter_v +2)->y + (iter_v +3)->y;

                    resultant = sqrt(pow(R1,2) + pow(R2,2));



                    cout<<"Resultant: "" "<<resultant<<endl;

            }

        }

当我出来试图添加所有x和y的部分时,程序运行正常,就像以前一样.....所以问题必须在那里..我猜语法不对,但是我不是最好的程序员,因为没有编译器警告,所以不能解决这个问题....程序只是在运行时崩溃

任何人都可以看到我在使用此代码时遇到的问题 问候

调试: enter image description here

很抱歉只是添加Debug断点的照片,但我认为在这种情况下图片值1000字:P

3 个答案:

答案 0 :(得分:1)

你可以通过控制迭代器+ 3是否超过向量(vect_add)限制来实现它,这样你就不会超过向量范围,对于每次迭代,你必须将迭代器增加4以获得你设计的方案:

for(vector<Point>::iterator iter_v = vect_add.begin(); iter_v - vect_add.begin() + 4 < vect_add.size(); iter_v+=4)
{ 
       R1 = iter_v->x + (iter_v +1)->x + (iter_v +2)->x + (iter_v +3)->x;
       R2 = iter_v->y + (iter_v +1)->y + (iter_v +2)->y + (iter_v +3)->y;

       resultant = sqrt(pow(R1,2) + pow(R2,2));



       cout<<"Resultant: "" "<<resultant<<endl;

 }

这里,iter_v - vect_add.begin()给出当前迭代器的索引,在for循环中我们检查是否有足够数量的元素用于加法操作。

答案 1 :(得分:0)

其中一个问题是:

R1 = iter_v->x + (iter_v +1)->x + (iter_v +2)->x + (iter_v +3)->x;
R2 = iter_v->y + (iter_v +1)->y + (iter_v +2)->y + (iter_v +3)->y;

iter_v + 1iter_v+ 3可能超出范围,导致尝试访问不属于vector的内存,因此崩溃。

在这种情况下,检查条件if(vect_add.size() >4)没有多大帮助。

这篇文章根本没有意义:

if(vect_add.size() > 20)
{
    vect_add.clear(); //does not make sense, you remove all the elements in vector?
}

答案 2 :(得分:0)

不知道这是否相关,但清除向量使迭代器无效。来自std::vector clear

  

与此容器相关的所有迭代器,指针和引用均无效。

你在这里清除你的矢量

if(vect_add.size() > 20)
{
     vect_add.clear();
}