C ++:我可以使用成员变量的迭代器并使其成为类之一吗?

时间:2018-02-23 11:11:32

标签: c++ vector iterator

我有一个slot_map<T>类,它使用std::vector<T>来存储所有数据。我需要slot_map<T>::iterator(以及const_iterator)。我可以用一种丑陋的方式做到这一点 - 自己制作迭代器并使它像std::vector<T>::iterator的界面一样工作,但这似乎是一个比它必须要复杂得多的解决方案(也是,我想清楚地表明slot_map迭代器不能只是传递std::vector<T>::iterator)。那么,有没有更简单的方法来接受vector<T>::iterator并羞辱地宣称它是我自己的?

编辑:slot_map数据结构使用多个向量来存储数据,并允许在恒定时间内插入和移除,以及快速迭代。其中一个向量包含所有数据(其顺序可以更改),另一个向这些数据保留索引以及该位置的代数(用于确定数据是否已标记为已删除且用户不应被允许)访问它)并且最后一个保留指数指数(是的,奇怪的),以允许恒定的时间去除而不破坏整个结构。

我需要做的只是通过数据向量进行迭代(向量中的对象可以在任何插入和擦除期间改变顺序,或者整个向量可以因为重新分配而移动 - 迭代器当然可以因此而变得无效但是,迭代器必须来自slot_map结构,而不是vector

1 个答案:

答案 0 :(得分:2)

这取决于你想用这样的迭代器实现什么。如果它只是对基础数据的无序访问,则typedef和关联的begin() / end()方法是最简单和最便宜的解决方案,例如

template<typename T> class slot_map {
public:
    typedef std::vector<T>::const_iterator const_iterator;

    const_iterator begin() const { return data.begin(); }
    const_iterator end() const { return data.end(); }

    // ...
private:
    std::vector<T> data;
    std::vector<size_t> indexes;
};

虽然提供写访问权限是另一回事,因为您将索引保存到数据中。写入data向量很可能会使这些索引无效。