类似迭代器的概念,可生成数据

时间:2014-05-15 17:47:57

标签: c++ iterator

我在磁盘上有(大量)图像文件。我想迭代它们并为每个图像做一些事情。我无法预先加载所有这些图片,我只想在需要时加载图片并在加载下一张图片之前将其处理掉。

我用boost实现了这个:iterator_facade和输入迭代器,它在operator()中加载图像。它有效,但我遇到了一些困难,它告诉我可能迭代器是为了迭代外部序列而不是拥有数据。

我想知道是否有一些标准的c ++习惯用法,这类数据拥有迭代器?

编辑:我写的代码是here

"困难"

image_pair& dereference() const {...}
  1. 我想返回image_pair这是对象的一部分,但由于dereference()是一个const方法,我不能这样做
  2. 由于同样的原因,我无法在取消引用方法中加载图像(这会更改对象的sice),所以我必须在increment()
  3. 中执行此操作。

    由于

1 个答案:

答案 0 :(得分:2)

迭代器应该提供一个值的引用,但这并不能阻止它管理相同的值。

考虑替代方案(1,2):

1)到目前为止,我发现最容易实现的仿函数接口。使用仿函数的代码可能看起来像

auto images = Image::all(); while (auto image = images()) {image->doSomething();}

其中Image::all返回由仿函数类或lambda实现的std::function<boost::optional<Image>()>

2)Rook使用流的想法看起来非常好看和惯用。可能看起来像

Images images; Image image; while (images >> image) {image.doSomething();}

其中operator >>返回Images&,其中operator bool()在流完成时返回false。

3)但是我看到迭代器一直用于那种事情,比如recursive_directory_iterator。其原因是重用通用算法,如std::findstd::copy。想象一下,使用std::copy创建图像备份:

std::copy (images.begin(), images.end(), backup.begin());

这是非常苛刻的,惯用的,并且遵循最不惊讶的原则。

我会说,作为开发人员,您可以选择使用仿函数(又名generator),流,迭代器还是其他东西,但迭代器方法通常是最友好的方法。您的API的用户。