有关Iterators and Reverse Iterators的程序

faye_2004 2004-10-05 05:04:09
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
void print (int elem)
{
cout << elem << ' ';
}
int main()
{
deque<int> coll;
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}

deque<int>::iterator pos1;
pos1 = find (coll.begin(), coll.end(), 2);
deque<int>::iterator pos2;
pos2 = find (coll.begin(), coll.end(),7);
for_each (pos1, pos2, print);
cout << endl;
deque<int>::reverse_iterator rpos1(pos1);
deque<int>::reverse_iterator rpos2(pos2);
for.each (rpos2, rpos1, print);
cout << endl;
}
the output of the program is as follows:
2 3 4 5 6
6 5 4 3 2
为什么输出是6 5 4 3 2,如何将Iterators范围转化为Reverse Iterators

...全文
117 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nlstone 2004-10-15
  • 打赏
  • 举报
回复
详见任何一本解释相关内容(逆迭代器)的书,譬如c++ standard library
简单地说,逆迭代器的内容是取其前一个元素的值.譬如说如果一个Reverse Iterator指向第五个元素,那么它的内容(譬如用*来访问,这是重载过的),会去取第四个元素的值.
这是为了使得find一类的算法不需要做任何改变即可应付逆迭代器(否则因为有半开区间的影响,逆迭代器find()的话就需要做更改,要么改find算法,要么改动传入find()的逆迭代器的位置)
faye_2004 2004-10-12
  • 打赏
  • 举报
回复
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
void print (int elem)
{
cout << elem << ' ';
}
int main()
{
deque<int> coll;
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}

deque<int>::iterator pos1;
pos1 = find (coll.begin(), coll.end(), 2);
deque<int>::iterator pos2;
pos2 = find (coll.begin(), coll.end(),7);
for_each (pos1, pos2, print);
cout << endl;
deque<int>::reverse_iterator rpos1(pos1);
deque<int>::reverse_iterator rpos2(pos2);
for.each (rpos2, rpos1, print);
cout << endl;
}
the output of the program is as follows:
2 3 4 5 6
6 5 4 3 2
为什么输出是6 5 4 3 2,如何将Iterators范围转化为Reverse Iterators
另一程序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> coll;
for (int i=1; i<=9; ++i) {
coll.push_back(i);}
vector<int>::iterator pos;
pos = find (coll.begin(), coll.end(),5);
cout << "pos: " << *pos << endl;
vector<int>::reverse_iterator rpos(pos);
cout << "rpos: " << *rpos <<endl;
}
输出为
pos: 5
rpos: 4为什么?


UPCCPU 2004-10-07
  • 打赏
  • 举报
回复
上面的问题可以看一看STL源代码:
template<class _RI,
class _Ty,
class _Rt = _Ty&,
class _Pt = _Ty *,
class _D = ptrdiff_t>
class reverse_iterator : public _Ranit<_Ty, _D> {
public:
...
_Rt operator*() const
{return (*(current - 1)); }
...
}
这是visual c++6.0中的reverse_iterator模板类的代码片断。
faye_2004 2004-10-07
  • 打赏
  • 举报
回复
另一程序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> coll;
for (int i=1; i<=9; ++i) {
coll.push_back(i);}
vector<int>::iterator pos;
pos = find (coll.begin(), coll.end(),5);
cout << "pos: " << *pos << endl;
vector<int>::reverse_iterator rpos(pos);
cout << "rpos: " << *rpos <<endl;
}
输出为
pos: 5
rpos: 4为什么?
prozax 2004-10-05
  • 打赏
  • 举报
回复
不是很对吗 有什么问题?
zhouwander 2004-10-05
  • 打赏
  • 举报
回复
在反向型迭代器中维护着一个随机迭代器,重载了++和--运算符也就变成反向的了,deque中的迭代器就是随机的。
_Myt& operator++()
{ // preincrement
--current;
return (*this);
}

_Myt operator++(int)
{ // postincrement
_Myt _Tmp = *this;
--current;
return (_Tmp);
}

_Myt& operator--()
{ // predecrement
++current;
return (*this);
}

_Myt operator--(int)
{ // postdecrement
_Myt _Tmp = *this;
++current;
return (_Tmp);
}
fangrk 2004-10-05
  • 打赏
  • 举报
回复
你不是已经转换了吗?

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧