有时候我们要写一些从数组的后面往前遍历的程序,但使用的却是正向迭代器。
比如:
typedef vector<int>::iterator iter;
iter last=--a.end();
for (iter i=last-1;i>=a.begin();i--)
{
for (iter j=last;j>=i+1;j--)
{
if ( *i < *j )
{
athwart=pair<iter,iter>(i,j);
return true;
}
}
}
这里 for (iter i=last-1;i>=a.begin();i--)中的i--一定会在i到达a.begin()之后再执行一次,这种操作是被终止的。程序到这里就崩溃了。所以遇到了此类问题一定要使用反向迭代器。
typedef vector<int>::reverse_iterator riter;
bool exist_athwart(vector<int>& a,pair<riter,riter>& athwart)
{
riter first=a.rbegin();
for (riter i=first+1;i<a.rend();i++)
{
for (riter j=first;j<i;j++)
{
if (*j > *i )
{
athwart=pair<riter,riter>(j,i);
return true;
}
}
}
return false;
}
这种使用的完整例子在《生成从1到n的全排列》那篇文章里有具体的用法,非常好用!