我在磁盘上有(大量)图像文件。我想迭代它们并为每个图像做一些事情。我无法预先加载所有这些图片,我只想在需要时加载图片并在加载下一张图片之前将其处理掉。
我用boost实现了这个:iterator_facade和输入迭代器,它在operator()中加载图像。它有效,但我遇到了一些困难,它告诉我可能迭代器是为了迭代外部序列而不是拥有数据。
我想知道是否有一些标准的c ++习惯用法,这类数据拥有迭代器?
编辑:我写的代码是here
"困难"
image_pair& dereference() const {...}
image_pair
这是对象的一部分,但由于dereference()是一个const方法,我不能这样做由于
答案 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::find
和std::copy
。想象一下,使用std::copy
创建图像备份:
std::copy (images.begin(), images.end(), backup.begin());
这是非常苛刻的,惯用的,并且遵循最不惊讶的原则。
我会说,作为开发人员,您可以选择使用仿函数(又名generator),流,迭代器还是其他东西,但迭代器方法通常是最友好的方法。您的API的用户。