我有一个 slot_map<T>
类,它使用 std::vector<T>
存储所有数据。我需要一个 slot_map<T>::iterator
(和一个 const_iterator
)。我可以用一种有点丑陋的方式来做到这一点——自己制作迭代器并让它像 std::vector<T>::iterator
的接口(interface)一样工作。 ,但这似乎是一个比实际要复杂得多的解决方案(另外,我想明确表示 slot_map
迭代器不能只是通过的 std::vector<T>::iterator
)。那么,有没有更简单的方法来获取 vector<T>::iterator
并可耻地宣称它是我的?
编辑:slot_map 数据结构使用多个 vector 来存储数据,并允许在常数时间内插入和删除,以及快速迭代。其中一个 vector 包含所有数据(其顺序可以更改),另一个 vector 保留这些数据的索引和该位置的世代计数(用于决定数据是否被标记为已删除并且不应让用户访问它),最后一个保留索引到索引(是的,很奇怪),以允许在不破坏整个结构的情况下进行恒定的时间删除。
我需要做的只是遍历数据 vector ( vector 中的对象可以在任何插入和删除过程中改变顺序,或者整个 vector 可以因为重新分配而移动 - 迭代器当然可以因此变得无效),但是迭代器必须来自 slot_map
结构而不是 vector
.
最佳答案
这取决于你想用这样的迭代器实现什么。如果只是对底层数据的无序访问,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
vector 很可能会使这些索引无效。
关于C++:我可以使用成员变量的迭代器并使其成为类之一吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48946532/