我有一个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
。
答案 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
向量很可能会使这些索引无效。