假设我有一个封装std容器的类:
class Stash
{
list<int> Data;
public:
list<int>::const_iterator GetAccess() const { return Data.begin(); }
};
这是迫使用户以迭代器的形式读取数据的非常方便的方法。但是,我找不到将迭代器与container.end()
进行比较的方法。所以,我想知道是否有一个选项可以单独使用stdlib,或者我必须自己编写迭代器类(例如使用can_advance
方法)。
相关问题可能是this one,但它询问迭代器是否有效,而不是是否可以提前。我无法找到有关后者的任何信息。
答案 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;
};
毋庸置疑,如果你需要的不仅仅是一个前向迭代器,这会变得更加复杂。