4

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

class Stash
{
    list<int> Data;

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

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

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

4

3 回答 3

4

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

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

于 2012-08-15T14:41:08.033 回答
2

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

GetAccess更改tobegin和 to的名称会更加惯用end。还end()可以将标准算法应用于数据。

于 2012-08-15T15:16:02.417 回答
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;
};

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

于 2012-08-16T01:24:16.437 回答