簡體   English   中英

Java和C ++中的迭代器有什么區別?

[英]What is the difference between iterators in Java and C++?

Java中Iterator的實現與C ++中的實現有何不同?

在當前的C ++(98)標准庫(特別是以前稱為STL的部分)中定義了一種非常接近C指針(包括算術)的迭代器形式。 因此他們只是指向某個地方。 為了有用,您通常需要兩個指針,以便您可以在它們之間進行迭代。 我理解C ++ 0x引入的范圍更像Java迭代器。

Java在1.2中引入了Iterator (和ListIterator )接口,主要接管了更詳細的Enumerable。 Java沒有指針算術,因此不需要像指針一樣工作。 他們有一個hasNext方法來查看它們是否已經結束,而不是需要兩個迭代器。 缺點是它們不夠靈活。 系統需要方法作為subList而不是在兩個迭代器之間迭代是包含列表中的特定點。

風格的一般差異是,雖然C ++通過模板使用“靜態多態”,但Java使用接口和常見的動態多態。

迭代器的概念是提供粘合劑以允許分離“算法”(真正的控制流)和數據容器。 兩種方法都做得相當好。 在理想情況下,“普通”代碼幾乎不應該看到迭代器。

C ++沒有指定迭代器的實現方式。 但它確實指定了它們的接口以及它們必須提供的最小行為才能使用其他標准庫組件。

例如,對於輸入迭代器,標准指定必須通過*運算符解除引用迭代器。 但是,它沒有說明如何實施該運營商。

在C ++中,您會看到人們一直在傳遞迭代器。 C ++迭代器“指向”容器的特定元素。 您可以取消引用迭代器來獲取元素(並且您可以反復執行此操作)。 您可以有效地擦除迭代器引用的元素。 您還可以復制迭代器(通過分配給另一個變量,或者通過值將迭代器傳遞給函數)來同時跟蹤多個位置。 C ++中的迭代器可能會因容器上的某些操作而“無效”,具體取決於容器。 當迭代器變為無效(其規則可能很復雜)時,使用迭代器的操作具有未定義的行為,並且可能(不一致地)使程序崩潰或返回不正確的結果; 雖然在某些數據結構中(例如std::list ),迭代器通過容器的大多數修改仍然有效。

在Java中,您沒有看到這種用法。 Java中的迭代器指向“兩個”元素之間,而不是“在”一個元素。 使用迭代器獲取元素的唯一方法是將其向前移動以獲取移動的元素。 當然,這會改變迭代器的狀態,你不能回頭; 除非你有一個ListIterator在這種情況下你可以向前和向后移動(但是為了保持靜止而必須向前和向后移動仍然很煩人)。 您無法復制迭代器,因為該接口不公開公共復制方法; 因此,例如,您不能只將特定位置的標記傳遞給函數,而不必為該函數提供對同一迭代器的引用,從而允許它們更改迭代器的狀態。 在Java中,迭代器將通過容器的任何修改而無效(至少在標准容器中),除非通過迭代器自己的add()remove()方法,這是過於保守的(例如, LinkedList上的大多數修改不應該影響一個迭代器)。 當您嘗試使用無效的迭代器時,它會引發ConcurrentModificationException (由於它與Concurrency無關而引起混淆),而不是可能導致未定義的行為,這很好。

C ++迭代器(STL)嘗試通過運算符重載盡可能地模仿指針語法。

標准規范定義了各種迭代器概念(如前向,雙向,隨機訪問,輸入,輸出)。 每個概念應該與特定接口匹配(例如,用於轉發迭代器的++運算符以按順序轉到下一個元素, - 用於雙向,+,+ =用於隨機訪問等)。

實現完全由C ++ / Java中的標准庫供應商/ JRE供應商定義。 只要他們的行為符合各自的標准,他們就可以隨意實施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM