如何构造容器的迭代器
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构造函数,也可以是私有构造函数,这完全取决于容器。
我想编写自己的容器,但在 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构造函数,也可以是私有构造函数,这完全取决于容器。