假设我有一个 C++ 迭代器,它不仅遍历数据结构,而且在取消引用时对元素应用转换。
作为一个真实世界的例子,这里有一个遍历位图中像素的迭代器,将位图特定的像素格式转换为方便的结构:
class ConstPixelIterator {
public: struct Pixel {
float Red;
float Green;
float Blue;
float Alpha;
};
public: ConstPixelIterator(const Bitmap &bitmap);
// ...standard iterator functionality...
public: Pixel operator *() {
// Read from memory and convert pixel format-specific bytes into Pixel structure
}
};
现在如果我想实现一个非常量迭代器(即让用户修改像素),最好的方法是什么?
我考虑的一些想法:
我可以将访问器方法放在
Pixel
结构中而不是普通字段中,并为其所有者提供一个引用,以便给家里打电话。 然而,这意味着如果用户更改 R、G、B 和 A,我会将像素转换为位图的像素格式 4 次并写入内存 4 次。我可以从迭代器返回一个像素引用,并为其提供一个
Update()
方法,如果像素发生更改,则需要调用该方法。 这将是不直观的,并且存在用户忘记调用Update
的风险。我总是可以按值返回
Pixel
并提供特殊的赋值运算符。 确实打破了标准的迭代器模式——在没有取消引用的情况下分配给迭代器应该移动迭代器,而不是更新它指向的元素
最佳答案
我们在 std::vector<bool>::iterator
中有一个现有示例- 必须使用一些技巧才能写入一位。
一个解决方案是返回一个 ProxyPixel
.它保留对原始像素的引用。您声明更新 R、G、B、A 可能会导致 4 次写入。这是事实,也是可以理解的。在第一次仅写入 R 之后,底层图像毕竟应该具有更新的 R 值。
或者您愿意接受最终的更新吗?在这种情况下,您可以延迟回写到 ProxyPixel::~ProxyPixel
.是的,随着代理像素的更改,底层图像将暂时不同步,但这样会更有效率。合理的权衡。
关于c++ - 是否可以在 C++ 中使用转换迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28274812/