【发布时间】:2018-02-23 11:11:32
【问题描述】:
我确实有一个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。
【问题讨论】:
-
为什么不在课堂上使用向量?你能发布一些你想要实现的代码吗?
-
从你写的内容来看,你想给一个完整的接口来在你的类中使用向量,为什么不只使用向量之一
-
我所拥有的是一个像这样的结构:
struct slot_map { ... private: std::vector<T> data; ... },我希望能够做像slotmap.begin()这样的迭代器,然后它会返回一个slot_map<T>::iterator对象。我很确定有一个非常简单的解决方案,或者根本没有,但我就是找不到。另外,即使我确实有一些 C++ 经验,但我对迭代器不是很好,所以如果解决方案真的很明显,请原谅。 -
为什么不想做 slot_map.data.begin()
-
但是您想通过迭代器完全访问它?我看不出区别