5

我有一个包含字符串的类。基本上这个类是建立在一个字符串数组上的:

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首先编写数据成员的目的。迭代器会是一个单独的类吗?

另外,是否有可能在迭代器中包含递增递减函数,以便我可以点到迭代器中以使用这些函数?

4

2 回答 2

7

指针是有效的双向迭代器。(这也是随机访问)

因此,您可以将迭代器支持添加到您的类中

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(); }
于 2013-11-06T16:10:52.130 回答
0

迭代器通常实现为您迭代的类的嵌套类。您重载了嵌套类的递增和递减运算符。现在你为什么写这可能是有道理的vector<int>::iterator it-iterator实际上是一个嵌套在vector<int>.

于 2013-11-06T16:07:34.340 回答