如何构造容器的迭代器

How to construct iterators of the container

我想编写自己的容器,但在 begin()end() 期间无意中创建了迭代器。

让我们假设它等同于 std::vector,但不是专用于 bool。当我键入 std::vector<int>::iterator:: 时,智能感知不显示任何构造函数。他们如何在 begin()end() 调用上构造迭代器?我想 iterator class 应该是容器的成员,我错了吗?

我相信构造函数是私有的,容器是迭代器的朋友。不过,我觉得我弄错了。

std::vector<T>::iterator 表示 std::vector<T> class 中有一个叫做 "iterator" 的东西。它可能是一个 typedef:

template<typename T> class vector {

public:

    typedef {{something}} iterator;
};

(注意:出于这个问题的目的,我忽略了 Allocator 模板参数,它不相关)。

或者,它可能是一个成熟的内部 class。

template<typename T> class vector {

public:

    class iterator {

        // ...
    };
};

也可能是其他一些tihngs。不管是哪种情况都没有关系。唯一可以保证的是,当你引用一个 std::vector<T>::iterator 时,你会得到满足迭代器要求的东西。

对于您的容器,您也可以自由地以产生正确结果的任何方式实现容器的迭代器。

但是,对于您的自定义迭代器,您会发现将迭代器设置为 properly inherit from std::iterator 很方便,因为 std::iterator 会自动声明一些所有迭代器都需要的东西,如果它们要与 C++ 库顺利互操作。

最后,就"how do they actually get constructed"而言,它们真的可以用任何方式构建。请注意,您没有显式构造迭代器,您使用 begin()end()find(),或... 所以,只有容器关心迭代器需要如何构造。可以是public构造函数,也可以是私有构造函数,这完全取决于容器。