2011-07-13 82 views
4

在很多文章中,我看到術語光標與術語迭代器可互換使用。然而,他們被視爲同一事物似乎並不正確。光標與迭代器模式

對我來說,迭代器允許在不知道容器本身的情況下迭代容器。另一方面,遊標允許迭代容器,但具有特定於容器類型的實現細節,因此它確實保留對容器的引用。另外,遊標的界面反映了容器類型的界面,如門面模式。

這裏是什麼,我會考慮光標的例子:

class Book {}; 

class Library 
{ 
    std::vector<Book> books; 

    bool IsBookHardCover(int bookIndex); 
    bool IsBookSoftCover(int bookIndex); 

    BookCursor GetFirstBook(); 
}; 

class BookCursor 
{ 
    std::vector<Book>& books; 
    int currentBook; 

    bool IsHardCover(); 
    bool IsSoftCover(); 

    void Next(); 
}; 

所以基本上我根據他們的依賴或者他們遍歷容器的知識迭代器和光標之間的區別。這是一個合適的區別?如果不是,那麼您會如何考慮我在上面的代碼示例中列出的設計模式?

請注意,我上面的代碼示例應該被視爲僞代碼,因爲我沒有編譯它,它也缺乏所需的構造函數。

+2

在許多情況下,迭代器確實知道它正在迭代的容器。差異似乎在客戶端代碼中,其中迭代器只會公開迭代器接口,而您的遊標會公開自定義容器的一些特定實現細節。 –

+0

你從哪裏得到這個「光標」的定義? –

+1

你的光標模式實現了什麼,通過取消引用迭代器無法實現?另外,迭代器實現(必要時)必須知道它正在迭代的容器的某些內容 - 但是對迭代器的操作只需要知道迭代器的功能,而不需要了解底層容器。 –

回答

6

您描述的光標模式是兩種模式的組合:代理和迭代器。標準庫不同的原因是爲了避免不必要地耦合這兩種行爲。

1

Wikipedia將光標圖案重定向到Iterator Pattern的頁面。考慮到這一點,我會說你正在分裂頭髮。如果我們可以認爲維基百科是一個明確的參考,這兩個術語可以互換使用。

+2

如果我以爲維基百科是「一切盡在乎」的資源,我就不會在這裏問這些。我所描述的模式是某種東西。如果它不是光標模式,那麼我想知道它是什麼。 –

+5

TBH四人幫「設計模式」書中說迭代器模式是「也稱爲」光標。 – piatek

0

迭代器(至少在C++標準中定義的方式)不允許您訪問底層容器的屬性,但這些詳細信息可通過不同的迭代器類別訪問(可通過iterator_tags訪問) 。

我也覺得你的例子有缺陷。當我可以訪問包含的值並查詢其屬性時,爲什麼數據集合會鏡像數據的接口(例如IsHardCover())?

0

傳統上,在使用術語設計模式之前,詛咒者比迭代器更強大,因爲他們允許更大的擴展來修改底層數據結構。 類似於insertBefore(),insertAfter()或insertAt()等。 某些實現允許多個遊標可以在同一個容器上操作,並且彼此通知操作(它們在我們的日子裏稱爲穩定的迭代器,或穩定的數據結構)