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

标签 c++ vector iterator

我有一个 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/

相关文章:

c++ - 继承子类时默认的保护级别是多少?

c++ - 简单的平均计算

c++ - 通过套接字发送文件太慢

c++ - 不能在 vector 的 vector 上 emplace_back() 花括号初始化器

c++ - 我可以使用插入函数将元素添加到 vector 的 vector 中吗?

c++ - std::set_intersection 和迭代器

Java 迭代器与 for 循环

c++ - 为什么不重载 std::vector::erase 以获取整数索引?

performance - 如何根据条件重复向量中的某些元素?

Python 迭代器和 zip