У вас все еще есть проблема с идеей, что currPoly.end () не указывает на допустимый элемент. end () указывает на один после последнего действительного элемента.
Поскольку вы используете вектор в качестве кольца, использование целочисленных индексов в векторе фактически будет лучшим способом написания вашего кода. Вы можете модифицировать индексы по размеру вектора вместо написания специального кода. Но так как вы делаете это для изучения STL, мы будем придерживаться итераторов. Вот как я думаю, правильный код должен выглядеть (я не скомпилировал его, чтобы посмотреть, работает ли он):
vector<Vertex> currPoly=polygons.back();
vector<Vertex>::iterator it;
for(it=currPoly.begin();it!=currPoly.end();++it){
vector<Vertex>::iterator p1;
vector<Vertex>::iterator n1;
vector<Vertex>::iterator n2;
if(it==currPoly.begin()){
p1=currPoly.end()-1;
n1=it+1;
n2=it+2;
}else if(it==currPoly.end()-1){
p1=it-1;
n1=currPoly.begin();
n2=n1+1;
}else if(it==currPoly.end()-2){
p1=it-1;
n1=it+1;
n2=currPoly.begin();
}else{
p1=it-1;
n1=it+1;
n2=it+2;
}
int tmp;
tmp=it->x;
tmp=p1->x;
}
И вот что я думаю, что индексная версия будет выглядеть (опять же, не проверял это с помощью компилятора):
vector<Vertex> currPoly=polygons.back();
for(int i=0; i < currPoly.size(); ++i){
int p1 = (i+currPoly.size()-1)%currPoly.size();
int n1 = (i+1)%currPoly.size();
int n2 = (i+2)%currPoly.size();
int tmp;
tmp=currPoly[i].x;
tmp=currPoly[p1].x;
}