RT。为什么不可以用正向迭代器进行反向遍历?
求各位指点。
反向迭代器确实没必要,看如下程序:
#include <iostream>
#include <list>
using namespace std;
int main()
{
// list container for character elements
list<char> coll;
// append elements from 'a' to 'z'
for (char c='a'; c<='z'; ++c) {
coll.push_back(c);
}
list<char>::const_iterator pos;
for (pos = coll.begin(); pos != coll.end(); ++pos) {
cout << *pos << ' ';
}
cout << "\n";
//用正向迭代器倒序输出。
for (pos = --coll.end(); pos != --coll.begin(); --pos) {
cout << *pos << ' ';
}
cout << endl;
}
以上程序,输出结果是:
a b c d e f g h i j k l m n o p q r s t u v w x y z
z y x w v u t s r q p o n m l k j i h g f e d c b a
我们只要记住: [ begin(), end() ),是一个半开半闭区间,包括最左项,不包括最右项,begin()指向第一个元素,end()指向最后一个元素的下一个元素,就不会弄错。
用数组来举例,int a[10],其有效元素是a[0] -- a[9], a[10]则是内存越界了;同理,end()指向的内容等价于a[10],而不是a[9],其实也是内存越界了。
你的程序永远不应该访问end(),也就是说不要对end()进行*运算, 如同你的程序永远不要访问a[10],这两者都可能导致灾难性的程序错误。
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
我觉得衍生正向和反向两种迭代器的
好处是
从数据结构链的任意起点遍历到任意终点都能够以简洁的方式写出代码,而不用去绕脑子,容易出错。
缺点是
为了节省程序员的脑力,数据结构可能变的更臃肿一些,空间成本变大,反向迭代器的执行效率也未必高。