2013-09-01 58 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

你不知道。

範圍是兩個迭代器,當你移動迭代器時你應該幾乎總是在一個範圍內工作。

容器也是範圍,所以你可以將容器放在周圍,但通常你不需要整個容器。

相關問題