前面讨论了linux风格的链表的做法。那个例子没有用到迭代器。现在把它加上:
class list {
public:
struct node {
pair<node*, node*>link;
} handle;
list() {
handle.link.first=handle.link.second=&handle; }
~list() {
}
public:
struct iterator_st {
node *p;
};
class iterator : iterator_st{
public:
iterator operator++();
iterator operator++(int);
iterator operator--();
iterator operator--(int) ;
bool operator==(iterator it);
};
iterator begin();
iterator end();
};
list部分的代码这里就省略了。参见前文<<C++的封装(十一):linux风格的链表和稀疏矩阵>>https://blog.youkuaiyun.com/aaasssdddd96/article/details/139167455。
list需要创建begin()迭代器和end()迭代器。这两个是iterator类逻辑上的构造函数。这就是iterator的对象工厂了。这部分内容在前文<<C++的封装(十二):外部构造函数>>https://blog.youkuaiyun.com/aaasssdddd96/article/details/139551253也讨论过了。list创建迭代器对象需要访问iterator的私有数据,所以iterator类应当声明list为友元。自然,友元不是唯一的办法,只要能解决好访问的问题,友元不友元无所谓了。这里打算用前文<<C++的封装(十):数据和代码分离>>中讨论的方法来处理这个问题https://blog.youkuaiyun.com/aaasssdddd96/article/details/137865098。所以让class iterator 继承了struct iterator_st。这里想说明,在别人的代码里,看到代码不是自己想象的样子,也不用奇怪,因为有各种不同的实现方法。
有了这些之后,就可以给出一个客户化后的遍历的例子:
struct node {
int x;
list::node node;
static struct node *recast(list::node *p) {
struct node *q;
list::node node::*r= &node::node;
reinterpret_cast<int &>(q)=
reinterpret_cast<int >(p)-
reinterpret_cast<int

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



