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;
}