使迭代器解引用对象

Make iterator dereference object

本文关键字:对象 引用 迭代器      更新时间:2023-10-16

我有一个简单的容器类,如:

class SimpleContainer {
    using iterator = std::vector<Contained*>::iterator;
    std::vector<Contained*> items_; // Note that 'Contained' is polymorphic.
public:
    iterator begin() { return items_.begin(); }
    iterator end() { return items_.end(); }    
};

简单。但是,当我在for循环中使用它时,我必须手动取消对该项的引用,如:

SimpleContainer container;
for (auto item : container) {
    cout << *item << endl; // Dereferencing here is ugly
}

是否有一种简单的方法使迭代器自动取消引用,或者我需要编写一个具有该行为的新迭代器?

如果可以使用boost,则仅为此目的创建indirect_iterator。使用

using iterator = boost::indirect_iterator<std::vector<Contained*>::iterator>;

然后需要用

修改begin()end()
iterator begin() { return boost::make_indirect_iterator(items_.begin(); }

更多详细信息请访问http://www.boost.org/doc/libs/1_56_0/libs/iterator/doc/indirect_iterator.html

您确定需要在容器中存储指针吗?我会像这样实现你的代码:

std::vector<Contained> items_;

在这种情况下,您不需要取消引用item对象。