在 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*
以确保对象已被解码(如果尚未解码)。
我正在设计一个 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*
以确保对象已被解码(如果尚未解码)。