迭代器和逆迭代器 我对C++和编程都很熟悉,在C++环境下编写了OpenCV应用程序。p>

迭代器和逆迭代器 我对C++和编程都很熟悉,在C++环境下编写了OpenCV应用程序。p>,c++,C++,我正在努力实现的目标: 好的,我得到了一些存储在向量中的矩形中心点,现在我使用一个反向迭代器,用矩形中心点迭代向量,并将每10个中心点存储到新向量中 然后我用普通迭代器再次迭代存储每10个矩形中心点的新向量,我想从第2个元素减去第1个元素,从第4个元素减去第3个元素,依此类推,减法结果,我想存储到另一个新向量:D 对某些人来说,这可能有点令人困惑;我自己也很困惑,这就是为什么我会在下面添加我所写的代码 vector<Point> Rightarm; vector<Point&g

我正在努力实现的目标:

好的,我得到了一些存储在向量中的矩形中心点,现在我使用一个反向迭代器,用矩形中心点迭代向量,并将每10个中心点存储到新向量中

然后我用普通迭代器再次迭代存储每10个矩形中心点的新向量,我想从第2个元素减去第1个元素,从第4个元素减去第3个元素,依此类推,减法结果,我想存储到另一个新向量:D

对某些人来说,这可能有点令人困惑;我自己也很困惑,这就是为什么我会在下面添加我所写的代码

vector<Point> Rightarm;
vector<Point> Leftarm;

vector<Point>::reverse_iterator RightMovmentIter;
vector<Point>::reverse_iterator LeftarmMovmentIter;

vector<Point> RightTracking;
vector<Point> LeftTracking;

for(RightMovmentIter = Rightarm.rbegin(); RightMovmentIter != Rightarm.rend(); RightMovmentIter+=10)
{
    RightTracking.push_back(*RightMovmentIter);
}

for(LeftarmMovmentIter = Leftarm.rbegin(); LeftarmMovmentIter != Leftarm.rend(); LeftarmMovmentIter+=10)
{
    LeftTracking.push_back(*LeftarmMovmentIter);
}

vector<Point>::iterator RresultIter;
vector<Point>::iterator Leftresult_Iter;
vector<Point> summery;

for(RresultIter = RightTracking.begin(); RresultIter != RightTracking.end(); RresultIter++)
{
    summery = *RresultIter - *RresultIter++;
}
向量右臂;
向量左臂;
vector::reverse_迭代器RightMovementiter;
vector::reverse_迭代器LeftArmMovementiter;
矢量跟踪;
矢量跟踪;
对于(RightMovementiter=Rightarm.rbegin();RightMovementiter!=Rightarm.rend();RightMovementiter+=10)
{
右跟踪。推回(*RightMovementiter);
}
对于(LeftArmMovementiter=Leftarm.rbegin();LeftArmMovementiter!=Leftarm.rend();LeftArmMovementiter+=10)
{
LeftTracking.push_back(*LeftArmMovementiter);
}
向量::迭代器RresultIter;
向量::迭代器Leftresult\u Iter;
向量求和;
对于(RresultIter=RightTracking.begin();RresultIter!=RightTracking.end();RresultIter++)
{
Summy=*RresultIter-*RresultIter++;
}
问题:

第一个问题是,当我运行程序时,我得到了运行时错误,我相信这是因为在向量Rightarm和Leftarm的开头没有10个元素,当迭代器运行它并试图寻找第10个元素时,我不能……那么我如何解决这个问题呢

第二个问题是关于这行的summy=*RresultIter-*RresultIter++;我知道这是错误的,这是我能想到的最好的尝试,但我想做的是从第二个元素中减去第一个元素,并将其存储在Summy元素中

希望这能很好地向读者描述我的问题
正如您正确注意到的那样,除非
Rightarm.size()
是10的精确倍数,否则这将不起作用。解决这一问题的一种方法是在开始时跳过元素,使结束行对齐

for(RightMovmentIter = Rightarm.rbegin() + Rightarm.size() % 10;
    RightMovmentIter != Rightarm.rend();
    RightMovmentIter+=10)
至于计算运行差异,有一个标准算法,
std::nexture_difference

std::adjacent_difference( RightTracking.begin(), RightTracking.end(),
      std::back_inserter( summery ) );
summery.erase( summery.begin() );

这将复制第一个值而不产生任何差异(类似于假设“在第一个值之前”的值为零),因此
erase()
行将消除该值。

您确定没有出现编译时错误吗
summy=*RresultIter-*RresultIter++
(顺便说一句,这是“summary”):减法对数组没有意义,而且这行也是超级卷积的;至少在术语周围加上括号。此外,您不能在迭代器上执行+=10;它可能跳过数组的末尾,进入未定义的内存。是的,很抱歉,我确实因为这一行而出现了编译器错误。当我删除这一行时,我出现了运行时错误。我最好的估计是因为迭代器+=10…………你知道我如何才能使所有这些都正常工作吗。。。?RegardSea最简单的方法是使用您自己的循环变量,如
for(int i=0;看,这样做只是为了确认您建议使用普通循环而不是迭代器…?请详细说明遇到的错误。“我得到一个错误”作为描述是无用的,您让我们来推测。