我想编写自己的容器,但我偶然发现在begin()
和end()
期间创建迭代器。
让我们假设它等同于std::vector
,但不适用于bool
。当我键入std::vector<int>::iterator::
intellisense时,不会显示任何构造函数。他们如何在begin()
和end()
电话上构建迭代器?我想iterator
类应该是容器的成员,我错了吗?
我认为构造函数是私有的,容器是迭代器的朋友。不过,我想我错了。
答案 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()
,或者......因此,只有容器才会关注迭代器的构造方式。它可以是公共构造函数,也可以是私有构造函数,这完全取决于容器。