在C ++中,是否可以实现一个迭代器接口,其中提前使“current”元素无效?

时间:2016-11-04 15:13:32

标签: c++ c++11 iterator api-design istream-iterator

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

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

begin, err := time.Parse("2006-01-02 15:04:05", "2016-12-25 "+string(start)+":00")
上一个用法示例中的

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),但是AFAIK,读取数据的方法也会返回副本(它们提取字符)。

2 个答案:

答案 0 :(得分:7)

听起来你正在谈论的是an input iterator

确保从std::iterator<std::input_iterator_tag, decoded_object_type>继承自定义迭代器类。经典实现是operator*缓存解码对象,如果在调用operator++之前第二次调用缓存对象,则返回缓存对象;并operator++调用operator*以确保对象被解码,如果它尚未解码。

答案 1 :(得分:2)

是的,没关系。 iostream基本相同:如果迭代从中获取的值,则可以复制它们,但是在流上的流或迭代器提前后,您无法保持指向它们的指针。