自动管理迭代器的容器

STL的容器实现了迭代器的分离,这样提高了效率。但实际使用时也带来了一些困惑。因为迭代器在使用时,并不显示指出它在引用哪个容器。而且当容器失效时,迭代器也不一起丢弃,不小心就造成误用。

可以考虑的方案是,让容器自动管理迭代器。当需要一个迭代器时,让容器分配这个迭代器,把迭代器存在容器里,而把它的Handle返回给客户。这样当容器销毁时,迭代器也一起销毁了。同时,为了显示指出迭代器引用哪个容器,重载operator[]。

这里暂且沿用前面讨论过的“带有删除标记的vector”来管理迭代器的分配,用list为例来展示容器。这是参考代码:

#include "vector.hpp"
#include <list>

class mylist {
    
    
        typedef list<int>::iterator iterator;
public:
        myvector<iterator> mv;
        list<int> lst;

        struct smart_index {
    
    
                int index;
                mylist *l;

                bool valid() {
    
    
                        iterator it = l->mv[index];
                        return it != l->lst.end();
                }
                void del() {
    
    
                        if (index ==l->mv.max-1) {
    
    
                                l->mv.max--;
                        }
                        else {
    
    
                                myvector<iterator>::iterator it;
                                it.it = vector<item<iterator> >::iterator(&l->mv
.v[index]);
                                it.v = &l->mv.v;

                                it.del();
                        }
                }
        };

        void append(int num) {
    
    
                lst.push_back(num);
        }

        smart_index get_smart_index() {
    
    
                iterator it;
                smart_index  ne;

                ne.index = mv.max;
                ne.l = this;
                it = lst.begin();
                mv.append(it);
                return ne;
        }

        int &operator[](smart_index &index) {
    
    
                iterator it = mv[index.index];
                int &val = *it;
                it = ++mv[index.index];

                return val;
        }
};


int main()
{
    
    
        mylist  ml;
        int i;
        mylist::smart_index si;


        for(i=0; i<10; i++) ml.append(1000+i);
        si = ml.get_smart_index();
        while(si.valid()) {
    
    
                printf("%d ", ml[si]);
        }
        printf("\n");
        si.del();
        return 0;
}

Guess you like

Origin blog.csdn.net/aaasssdddd96/article/details/110290516