【问题标题】:C++: Can I take an iterator of a member variable and make it one of the class?C++:我可以获取成员变量的迭代器并使其成为类之一吗?
【发布时间】: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()
  • 但是您想通过迭代器完全访问它?我看不出区别

标签: c++ vector iterator


【解决方案1】:

这取决于你想用这样的迭代器实现什么。如果只是无序访问底层数据,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 向量很可能会使这些索引无效。

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 2021-09-21
    • 2021-08-17
    • 2011-05-26
    • 2018-01-26
    • 1970-01-01
    • 2011-04-23
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多