如何检查简单的C ++标准库迭代器是否可以高级?

时间:2012-08-15 14:36:36

标签: c++ stl iterator

假设我有一个封装std容器的类:

class Stash
{
    list<int> Data;

public:
    list<int>::const_iterator GetAccess() const { return Data.begin(); }
};

这是迫使用户以迭代器的形式读取数据的非常方便的方法。但是,我找不到将迭代器与container.end()进行比较的方法。所以,我想知道是否有一个选项可以单独使用stdlib,或者我必须自己编写迭代器类(例如使用can_advance方法)。

相关问题可能是this one,但它询问迭代器是否有效,而不是是否可以提前。我无法找到有关后者的任何信息。

3 个答案:

答案 0 :(得分:4)

你不能这样做,单个迭代器在它所指向的序列的末尾不包含信息。

通常情况下,这可以通过向您的班级提供范围(考虑std::make_pair(cont.begin(), cont.end()))或提供​​begin()end()方法来解决,从而有效地使其成为范围。

答案 1 :(得分:2)

迭代器成对工作:指向序列开头的迭代器和指向序列末尾的迭代器。这就是为什么所有容器都具有begin()end()成员函数的原因:因此您可以查看容器管理的值序列。

GetAccess的名称更改为begin并添加end会更加惯用。拥有end()也可以将标准算法应用于数据。

答案 2 :(得分:0)

你似乎要求的是一个“超前”迭代器。您可以编写一个类来“调整”迭代器以具有前瞻性,其中适配器只比代码保持领先一步:

template<class FwdIter>
class lookahead_iterator
{
public:
    lookahead_iterator(const FwdIter& begin): cur_iter(begin), next_iter(++begin) {}
    operator FwdIter() const { return cur_iter; }
    lookahead_iterator<FwdIter>& operator ++() { cur_iter = next_iter++; return *this; }
    // Other methods as needed.
private:
    FwdIter cur_iter;
    FwdIter next_iter;
};

毋庸置疑,如果你需要的不仅仅是一个前向迭代器,这会变得更加复杂。