什么回归'开始'并且'结束'我的向量包装器的函数,用于迭代器?

时间:2011-10-31 22:04:44

标签: c++

我有一个名为PointList的类,它包含Point *个对象的向量作为其主要数据。我想以与矢量相同的方式迭代点,类似这样:

for (vector<Point *>::iterator it = point_list->begin(); it != point_list->end(); ++it)

显然我写的begin()和end()函数只能返回它们持有的向量的开始/结束函数,但这些函数的返回类型是什么?

4 个答案:

答案 0 :(得分:3)

如果我理解正确的问题,答案就在你的问题中。您已在代码段中使用beginend的返回值和类型。

vector<Point *>::iterator it = point_list->begin();

显然,it保留begin()的返回值,其类型众所周知:

vector<Point *>::iterator

顺便说一下,有点偏离主题 - 为什么point_list是指向向量的指针,而不是对象?第二,为什么它被称为列表,因为它是vector?使用vectorarraysequence,但不是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对象一样。但是为什么要在容器对象之外迭代数据呢?那会违反封装吗?