2010-06-20 77 views
0

我有這種情況:自定義迭代器:我如何跟蹤它?

我有一個跟蹤指針數組的類。我構建了一個循環遍歷這個數組的自定義迭代器。

我的問題是如何使它線程安全,特別是在遞增/遞減?

這裏是我有什麼相關部分的草案:

typedef fruit * iterator; 

class fruits 
{ 
    private: 
    fruit ** flist; 
    int n;  //keeps track of position in flist 
    int count; //number of fruits 

    public: 
    iterator begin() {n=0; return fruit[n];} 
    iterator end() {n=count; return fruit[n];} 

    iterator operator++() 
    { 
     return fruit[++n]; 
    } 
} 

我看到的問題是,如果程序兩個部分組成創建一個迭代的事情是行不通的。 C++ STL如何處理它?

更新:我發現我的方式的錯誤。迭代器應該自己跟蹤它的位置。爲此我創建了一個嵌入到我的主類中的迭代器類。生活現在很好。

回答

5

標準容器在獨立於容器的迭代器對象中維護其迭代狀態,因此可以同時在容器上進行多次迭代。所以begin()end()返回迭代器,但不改變容器的狀態; operator++作用於迭代器,而不是容器。對於一個簡單的數組這樣,一個指針(到fruit*,不是fruit)完美的作品以及一個迭代器,所以你可以定義begin()end()

iterator begin() {return flist;} 
iterator end() {return flist + count;} 

,並使用它像這樣:

for (iterator i = my_fruit.begin(); i != my_fruit.end(); ++i) 
    do_something_with(*i); // *i is a fruit* 

多線程同時執行此操作時沒有問題,只要它們都不嘗試修改容器。另一方面,除非這是學習練習,才能更好地理解容器和迭代器的工作方式,否則使用std::vector要比實現自己的版本要好得多。

+1

感謝在迭代器本身中保存其他狀態的想法。 – 2010-06-20 22:43:55