簡體   English   中英

為類編寫雙向迭代器

[英]Writing a bidirectional iterator for a class

我有一個持有字符串的類。 基本上該類是基於一個字符串數組:

class stringlist {
public:
    typedef std::string str;
    void push(str);
    void pop();
    void print();
    void resize(size_t);
    size_t capacity();
    size_t size();
    stringlist() : N(15) {}
    stringlist(size_t sz) : N(sz) {}
    ~stringlist() { delete [] container; }
}
private:
    size_t N;
    str* container = new str[N];
};

練習的下一部分要求讀者

為您的類編寫雙向迭代器

在本書的這一點上,沒有關於重載運算符等的討論。

如果我有像str* iterator(*str)這樣的東西,我將如何管理遞增,遞減等。我假設我可以為這些方法編寫一個單獨的函數,但這似乎會破壞編寫iterator數據成員的目的首先。 迭代器是一個單獨的類嗎?

此外,是否可以在迭代器中使用遞增遞減函數,以便我可以插入迭代器以使用這些函數?

指針是有效的雙向迭代器。 (它也是隨機訪問)

所以你可以用你的類添加迭代器支持

typedef str* iterator;
typedef const str* const_iterator;
iterator begin() { return container; }
const_iterator begin() const { return container; }
iterator end() { return begin() + size(); }
const_iterator end() const { return begin() + size(); }
const_iterator cbegin() const { return begin(); }
const_iterator cend() const { return end(); }

但是,您不能使用指針來實現反向迭代(它使用++向后,以及--向前)。 但是標准庫提供了一個很好的適配器(在#include <iterator>

typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
const_reverse_iterator crbegin() const { return rbegin(); }
const_reverse_iterator crend() const { return rend(); }

迭代器通常實現為您迭代的類的嵌套類。 您重載嵌套類的遞增和遞減運算符。 現在為什么你寫vector<int>::iterator it有意義 - iterator實際上是一個嵌套在vector<int>

暫無
暫無

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

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