在 C++ 中,是否可以实现推进使 "current" 元素无效的迭代器接口?

In C++, is it okay to implement an iterator interface in which advancing invalidates the "current" element?

我正在设计一个 C++ 接口,它允许用户迭代从文件解码的对象。这个解码过程有点慢。

我正在考虑为此使用迭代器接口,但我想避免任何不必要的复制,所以我正在考虑(用户方面):

for (const auto& object : file) {
    // you can access the members of `object` here
    std::cout << object.whatever() << std::endl;

    // you can copy `object` here
    myObjectCopy = object;

    // you CANNOT do this because `object` changes
    // as soon as the iterator advances
    myObjectPtr = &object;
}

object 在前面的用法示例中是对迭代器实例内部对象的引用。

这是错误的吗?您会在这里推荐哪些其他惯用界面?

我想到了一个流接口(想想std::istream),但是据我所知,读取数据的方法也return个副本(它们提取个字符) .

是的,没关系。 iostream 基本上是相同的:如果您迭代从中获取的值,您可以复制它们,但是在流或流上的迭代器被推进后,您不能持有指向它们的指针。

听起来你说的是 an input iterator

请务必从 std::iterator<std::input_iterator_tag, decoded_object_type> 继承您的自定义迭代器 class。 classical 实现是为了 operator* 缓存解码后的对象,return 如果在 operator++ 被调用之前第二次调用缓存的对象;并且 operator++ 调用 operator* 以确保对象已被解码(如果尚未解码)。