有时候我们要写一些从数组的后面往前遍历的程序,但使用的却是正向迭代器。
比如:
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的全排列》那篇文章里有具体的用法,非常好用!
分享到:
相关推荐
这就是为什么我们生成头文件的多个版本的原因,因此,较新版本不会受到C ++先前版本中缺少功能的阻碍。 “仅标头”是什么意思? 这意味着不需要单独的编译步骤。 这意味着与您的项目进行微不足道的集成,只需复制...
10.4.3 反向迭代器 363 10.5 泛型算法结构 365 10.5.1 5类迭代器 365 10.5.2 算法形参模式 367 10.5.3 算法命名规范 368 10.6 特定容器算法 369 小结 371 术语表 371 第11章 关联容器 373 11.1 ...
10.4.3 反向迭代器 363 10.5 泛型算法结构 365 10.5.1 5类迭代器 365 10.5.2 算法形参模式 367 10.5.3 算法命名规范 368 10.6 特定容器算法 369 小结 371 术语表 371 第11章 关联容器 373 11.1 ...
LRU LRU 是一个轻量级的用于 list 和 map<K> 容器。 用 C++11 编写LRU 是独立的。 没有依赖性。 LRU 很小。 仅标题。 LRU 是跨平台的。... 插入键上的.find(K)会将元素提升到头部并返回实际的.begin()迭代器。 .f
开源项目-cbegin-graven.zip,Graven: Build management for Go projects.
将AVL树实现为具有双向迭代器Class接口的容器: template < class xss=removed>> class BST { public: BST (); BST ( const BST &); BST& operator = ( const BST &); template void assign (InputIt, ...