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

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

本文关键字:推进会 接口 元素 无效 迭代器 current 是否 C++ 实现 一个      更新时间:2023-10-16

我正在设计一个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),但是AFAIK,读取数据的方法也返回副本(他们提取字符)。

听起来你说的是一个输入迭代器

确保从std::iterator<std::input_iterator_tag, decoded_object_type>继承您的自定义迭代器类。一个经典的实现是operator*缓存解码的对象,并返回缓存的对象,如果它被调用第二次之前operator++被调用;和operator++调用operator*来确保对象被解码,如果它还没有。

可以。iostream基本上是相同的:如果你对从它得到的值进行迭代,你可以复制它们,但在流或流上的迭代器进阶之后,你不能保留指向它们的指针。