2011-07-29 47 views
1

我正在寻找一种方法来模拟“作用域迭代器”(缺少更好的短语)。基本上,我想从一个集合(在这种情况下为map)获取一个迭代器,并将其包装在一个“范围迭代器”中,一旦最后一个引用被删除,该集合将从集合中删除元素/迭代器。我目前的做法在下面,但我正在寻找更优雅的东西。作用域/参考计数迭代器

typedef std::map<int,bool> map_type; 
typedef map_type::iterator iter_type; 

void iterDelete(std::shared_ptr<map_type> map, iter_type * iter) 
{ 
    map->erase(*iter); 
    delete(iter); 
}  

int main() 
{ 
    std::shared_ptr<map_type> myMap(new map_type()); //std::map because iterators are not invalidated by erase/insert 
    iter_type myIter = myMap->find(7); 
    std::shared_ptr<iter_type> scopedIter(new iter_type(myIter), std::bind(iterDelete, myMap, std::placeholders::_1)); //Deleters keep map in scope until all "scoped iterators" die. 
} 

回答

1

最简单的事情就是对shared_ptr使用自定义的删除器,它将从地图中删除该元素。另外,void main()是坏的。

+0

我希望比使用shared_ptr更优雅。另外,我保证我不会在实际代码中使用void main();这只是为了简洁。 :-) – tgoodhart

+0

@tgoodhart:'int main()'为了简洁起见更好:) – UncleBens

+0

@tgoodhart:如果你想引用计数,不要重新发明轮子,使用'shared_ptr'。 – Puppy