为类编写双向迭代器

时间:2013-11-06 16:05:47

标签: c++

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

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)的东西,我将如何管理增量,减量等。我假设我可以为这些方法编写一个单独的函数,但这似乎会破坏编写{{{ 1}}数据成员首先。迭代器是一个单独的类吗?

此外,是否可以在迭代器中使用递增递减函数,以便我可以插入迭代器以使用这些函数?

2 个答案:

答案 0 :(得分: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(); }

但是,您不能使用指针来实现反向迭代(使用++向后移动,而--向前移动)。但标准库提供a nice adaptor (in #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(); }

答案 1 :(得分:0)

迭代器通常实现为您迭代的类的嵌套类。您重载嵌套类的递增和递减运算符。现在为什么写vector<int>::iterator it - iterator实际上是嵌套在vector<int>中的类可能有意义。