2013-03-29 3 views
0

Я спокойно говорю на C++ и программирую вообще, я пишу приложение OpenCv в среде C++.Итератор и реверс Iterator

Я пытаюсь ДОСТИЖЕНИЕ:

ОК, так что я получил некоторые моменты Прямоугольников центра находятся в векторе, сейчас я использую обратный итератор для перебора вектора с прямоугольными центральными точками и хранить каждый 10-й центра укажите новый вектор.

Я снова повторяю этот новый вектор, который хранит каждую 10-ю центральную точку прямоугольника с нормальным итератором. И я хочу вычесть 1-й элемент из 2-го элемента 3-го элемента из 4-го элемента и так далее, результаты вычитания, я хочу сохранить в другой новый вектор: 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++; 
} 

ПРОБЛЕМА:

первая проблема в том, что при запуске программы я получаю во время выполнения ошибки I убеждения, что это потому, что в начале вектора Rightarm & Leftarm не имеют 10 элементов и при запуске итератора через него и пытается искать 10-й элемент, я не могу ... Как я могу это сделать?

Вторая проблема связана с этой строкой summery = * RresultIter - * RresultIter ++; Я знаю, что это неправильно, и это лучшая попытка, о которой я мог подумать, но я хочу, чтобы вычесть 1-й элемент из второго элемента и сохранить его в элементе summery ...

Надеюсь, это очень хорошо описывает мою проблему для читателей С уважением

+0

Уверены, что вы не получили ошибку времени компиляции? 'summery = * RresultIter - * RresultIter ++' (это «summary» btw): вычитание не имеет смысла для массивов, и эта линия также супер-запутана; по крайней мере, положить скобки вокруг условий. Также вы не можете сделать + = 10 на итераторе; он может пропустить последний конец массива и перейти в неопределенную память. – Dave

+0

Да, жаль, что я получаю ошибку компилятора из-за этой строки, когда я удаляю эту строку. Я получаю ошибку времени выполнения. Самый лучший из них - из-за Итератора + = 10 .......... У вас есть идея, как я могу положить все это на работу ...? привет – Tomazi

+0

Самый простой способ - использовать собственную переменную цикла, например 'for (int i = 0; i Dave

ответ

0

Как вы правильно заметили, это не сработает, если Rightarm.size() не является точным кратным 10. Один из способов обойти это - пропустить элементы в начале, чтобы сделать конечную линию вверх ,

for(RightMovmentIter = Rightarm.rbegin() + Rightarm.size() % 10; 
    RightMovmentIter != Rightarm.rend(); 
    RightMovmentIter+=10) 

Что касается принятия бегущего разница, есть стандартный алгоритм для этого, std::adjacent_difference.

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

Это копирует первое значение без учета разницы (аналогично предположению, «до-заместитель первого» значение равно нулю), так что erase() линия избавляется от этого.

Смежные вопросы