C++ 在向量上迭代时出现运行时错误

C++ 在向量上迭代时出现运行时错误,c++,C++,我在一个存储点数据类型元素[x,y]的向量上迭代,我想在每次迭代中实现的是添加前4个点x元素和前4个点y元素……在下一次迭代中,我想对下4个x&y元素做同样的操作……以此类推 第一次迭代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;

我在一个存储点数据类型元素[x,y]的向量上迭代,我想在每次迭代中实现的是添加前4个点x元素和前4个点y元素……在下一次迭代中,我想对下4个x&y元素做同样的操作……以此类推

第一次迭代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;

            }

        }
双Pta;
双Ptb;
点向量;
浮球R1,R2;
浮点数;
向量向量加;
对于(向量::迭代器iter_a=左手臂_xy.begin()+1;iter_a!=左手臂_xy.end();+iter_a)
{
if(center.yx-(iter_a-1)->x;
向量y=iter\u a->y-(iter\u a-1)->y;
向量添加。向后推(点(向量x,向量y));
对于(向量::迭代器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;
结果=sqrt(功率(R1,2)+功率(R2,2));

cout问题之一是:

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+1
iter_v+3
可能超出范围,导致尝试访问不属于
向量的内存,因此崩溃

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

这篇文章毫无意义:

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

不知道这是否相关,但清除向量会使迭代器无效。从

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

在这里清除向量

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

您可以通过控制迭代器+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();iter_v-vect_add.begin()+4x+(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; 结果=sqrt(功率(R1,2)+功率(R2,2));
你能猜到
vect\u add.size()>4
是什么意思吗?如果这个向量中有4个以上的元素,那么继续并执行这个if语句中的代码,你是正确的。因此如果
vect\u add.size()
是3,那么这个代码永远不会运行。如果
vect\u add.size()
为5,将运行5次。这与您对程序的描述不符。谢谢您的建议我的代码可能与我的问题不符的原因是因为代码本身不是100%正确这就是我寻求某种帮助的原因:p您现在就快到了。考虑到您想查看这些ele每次检查4次,重新检查
++iter\u v
循环中的
++iter\u v
++iter\u v
表示“一次1次”。感谢您的回复……我想这就是我添加此条件的原因
如果(vect\u add.size()>4)
那么,我如何重新安排更改此项,以便实现我的目标…?@Tomazi您可以将向量迭代条件更改为:iter\u v+3!=vect\u add.end()。在这种情况下,检查根本没有用。好吧,我删除了检查,厌倦了你的建议,但每次迭代都增加我的iter_v+3,效果都是一样的。@Tomazi我的建议是,你尝试在代码中设置断点,并使用调试器来检查到底发生了什么。好吧,我已经通过调试并发现了我想这是什么意思…x和y在迭代过程中的某个时候丢失了…在我的原始帖子上面上传了照片^^^^^^^^^^^是的,你是对的,我之所以有这个if语句是因为我尝试了一些东西:P,在创建这个帖子时忘记删除这个部分…呵呵,你这个人:)非常感谢,我在任何时候都没有接近这个解决方案。谢谢