如何检查是否可以推进简单C++标准库迭代器

How to check if simple C++ standard library iterator can be advanced?

本文关键字:简单 C++ 标准 迭代器 何检查 检查 是否      更新时间:2023-10-16

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

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

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

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

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

通常,这是通过提供一个范围(思考std::make_pair(cont.begin(), cont.end()))或为您的类提供begin()end()方法来解决的,从而有效地使其成为一个范围。

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

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

您似乎要求的是"展望"迭代器。你可以编写一个类来"调整"迭代器以进行展望,其中适配器只是比你的代码领先一步:

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;
};

不用说,如果您需要的不仅仅是前向迭代器,这会变得更加复杂。