c++ - 是否可以在 C++ 中使用转换迭代器?

标签 c++ iterator type-conversion conventions updating

假设我有一个 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/

相关文章:

C++ : Swapping template class elements of different types?

java - `cond`中的 `if (!cond(it.next()))`代表什么?

SQL : How to sum multiple bit columns in a row

c++ - 在Linux C++中,如何读取指定用户的环境变量?

c++ - OpenMP 优化 for 循环的调度

c++ - 将两个功能合二为一

c++:&rand 到底是做什么的?

c++ - 如何从 C++ 中的另一个类迭代获取数据?

c - 为什么从返回 int32_t 的函数返回 0x80000000 不会导致警告?

java - 如何通过 DomainClassConverter 使用自定义 ID 转换?