例如,如何在没有任何其他信息的情况下实现以下功能?如何检查迭代器是否在没有容器的情况下碰到末端?
bool isEnd(set<int> :: iterator itr);
我知道我可以这样做,但如何做到这一点没有输入变量“s”?
bool isEnd(const set<int> &s, set<int> :: iterator itr) {
return itr == s.end();
}
例如,如何在没有任何其他信息的情况下实现以下功能?如何检查迭代器是否在没有容器的情况下碰到末端?
bool isEnd(set<int> :: iterator itr);
我知道我可以这样做,但如何做到这一点没有输入变量“s”?
bool isEnd(const set<int> &s, set<int> :: iterator itr) {
return itr == s.end();
}
对于标准的C++库,没有办法编写它。
std::set
可以实现为例如, red-black trees,然后迭代器就是里面的节点,你需要整棵树来判断这个节点是否是最后一个。
实际上,像'std :: set'这样的rbtree,迭代器是节点指针,'end()'总是指向一个特殊的'不是实际的数据节点'节点,所以这很容易。有问题的情况是'std :: vector',其中迭代器只是指向vector数据数组的指针,并且您需要vector的size来判断何时结束。 –
您需要创建第一个缓冲区的第二个迭代器。换句话说,它总是前进一个元素。用这种方法你可以知道它是否在最后。在这个伪代码中,这是:
Iterator<T> baseIterator;
T nextElement;
void init()
this.nextElement= this.baseIterator.next() ;
boolean isEnd()
return this.nextElement == null ;
T next()
T result= this.nextElement ;
this.nextElement= this.baseIterator.next() ;
return result ;
第二个迭代器如何检测容器的末端?这不是同一个问题吗? – Blastfurnace
你不知道。
范围是两个迭代器,当你移动迭代器时你应该几乎总是在一个范围内工作。
容器也是范围,所以你可以将容器放在周围,但通常你不需要整个容器。
你不能。在迭代器本身没有任何东西表明它已经结束了,你需要另一个迭代器来比较它。 –