2013-09-01 32 views
4

例如,如何在没有任何其他信息的情况下实现以下功能?如何检查迭代器是否在没有容器的情况下碰到末端?

bool isEnd(set<int> :: iterator itr); 

我知道我可以这样做,但如何做到这一点没有输入变量“s”?

bool isEnd(const set<int> &s, set<int> :: iterator itr) { 
    return itr == s.end(); 
} 
+3

你不能。在迭代器本身没有任何东西表明它已经结束了,你需要另一个迭代器来比较它。 –

回答

2

对于标准的C++库,没有办法编写它。

std::set可以实现为例如, red-black trees,然后迭代器就是里面的节点,你需要整棵树来判断这个节点是否是最后一个。

+1

实际上,像'std :: set'这样的rbtree,迭代器是节点指针,'end()'总是指向一个特殊的'不是实际的数据节点'节点,所以这很容易。有问题的情况是'std :: vector',其中迭代器只是指向vector数据数组的指针,并且您需要vector的size来判断何时结束。 –

0

您需要创建第一个缓冲区的第二个迭代器。换句话说,它总是前进一个元素。用这种方法你可以知道它是否在最后。在这个伪代码中,这是:

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 ; 
+1

第二个迭代器如何检测容器的末端?这不是同一个问题吗? – Blastfurnace

2

你不知道。

范围是两个迭代器,当你移动迭代器时你应该几乎总是在一个范围内工作。

容器也是范围,所以你可以将容器放在周围,但通常你不需要整个容器。

相关问题