我有一个名为PointList
的类,它包含Point *
个对象的向量作为其主要数据。我想以与矢量相同的方式迭代点,类似这样:
for (vector<Point *>::iterator it = point_list->begin(); it != point_list->end(); ++it)
显然我写的begin()和end()函数只能返回它们持有的向量的开始/结束函数,但这些函数的返回类型是什么?
答案 0 :(得分:3)
如果我理解正确的问题,答案就在你的问题中。您已在代码段中使用begin
和end
的返回值和类型。
vector<Point *>::iterator it = point_list->begin();
显然,it
保留begin()
的返回值,其类型众所周知:
vector<Point *>::iterator
顺便说一下,有点偏离主题 - 为什么point_list
是指向向量的指针,而不是对象?第二,为什么它被称为列表,因为它是vector
?使用vector
,array
或sequence
,但不是list
,因为这可能会产生误导。 list
是STL容器,与vector
不同。
答案 1 :(得分:1)
他们的返回类型为vector<Point *>::iterator
。
答案 2 :(得分:1)
您应该通过提供两个迭代器类型,三个begin
函数和三个end
函数来复制容器接口。要使用的最明显的迭代器类型是直接从向量中获取:
struct PointList {
typedef std::vector<Point*>::iterator iterator;
typedef std::vector<Point*>::const_iterator const_iterator;
iterator begin();
const_iterator begin() const;
const_iterator cbegin() const;
iterator end();
const_iterator end() const;
const_iterator cend() const;
};
cbegin()
和cend()
是C ++ 11的新手,它们不在C ++ 03中。这个想法是因为它们没有非const重载,用户可以在非const容器上调用它们,而不是使用转换。
由于底层存储位于向量中,您可能还会考虑提供(c)rbegin()
和(c)rend()
。事实上,要实现拥有的标准容器接口,因为您的迭代器类型是随机访问。如果你不想这样做(也许是因为这个类的未来实现不一定会使用向量,而是下面的一些其他容器),那么有一个参数可以将向量的迭代器包装在你自己的类中你把矢量包装在你自己的一个类中。如果您需要阻止用户依赖迭代器的属性(可能在将来的实现中消失),那么这是额外的工作。您可能不会在内部API中关注这一点,在已发布的API中更是如此。
答案 3 :(得分:0)
它们的类型为vector<Point *>::iterator
,就像您的it
对象一样。但是为什么要在容器对象之外迭代数据呢?那会违反封装吗?