如何构造容器的迭代器

时间:2016-07-17 01:54:20

标签: c++ iterator stdvector

我想编写自己的容器,但我偶然发现在begin()end()期间创建迭代器。

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

我认为构造函数是私有的,容器是迭代器的朋友。不过,我想我错了。

1 个答案:

答案 0 :(得分:2)

std::vector<T>::iterator表示std::vector<T>类中有一些名为“iterator”的东西。它可能是一个typedef:

template<typename T> class vector {

public:

    typedef {{something}} iterator;
};

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

或者,它可能是一个完整的内部阶级。

template<typename T> class vector {

public:

    class iterator {

        // ...
    };
};

它也可能是其他一些东西。无论是哪种情况都无关紧要。您唯一能保证的是,当您引用std::vector<T>::iterator时,您会得到满足迭代器要求的内容。

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

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

最后,就“他们如何实际构建”而言,他们真的可以以任何方式构建。请注意,您没有显式构造迭代器,使用begin()end()find(),或者......因此,只有容器才会关注迭代器的构造方式。它可以是公共构造函数,也可以是私有构造函数,这完全取决于容器。