我有一个包含字符串的类。基本上,该类建立在一个字符串数组上:
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}}数据成员首先。迭代器是一个单独的类吗?
此外,是否可以在迭代器中使用递增递减函数,以便我可以插入迭代器以使用这些函数?
答案 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>
中的类可能有意义。