稀疏容器和迭代器

时间:2014-07-24 21:42:31

标签: c++ iterator containers

我实现了一个稀疏容器,一个基本的查找表(LUT)。
它基本上是vector<T>map<size_t, T>之间的混合:

  1. 容器是固定大小的(即大小被指定为构造函数参数并且不会更改)
  2. 每个插槽最初在逻辑上都是默认值(通常只为零)
  3. 然后,呼叫者可以根据需要在任何位置读取或写入条目(就像使用vector一样)
  4. 然后,调用者可以有效地枚举非默认条目
  5. (我实际上如何实现这个容器是无关紧要的,所以我不会去那里。)

    现在我正在尝试为它设计一个迭代器,但我一直试图弄清楚如何。

    一方面,迭代器应该是随机访问的,因为容器本质上是稀疏的vector,否则行为或多或少相同。

    另一方面,假设每个槽的“默认”条目是可忽略的;也就是说,评估for_each(lut.begin(), lut.end(), func)之类的内容以及 的内容是否必须跳过具有默认值的广告位(为了大幅加速)。

    问题:

    如何为此类正确设计迭代器?它甚至有意义吗?

    目前,我正在考虑实现它,使iterator::operator++增加迭代器以指向下一个非默认条目,而iterator::operator+(d)只是添加偏移量d,无论是否该插槽的条目是否有效。所以“递增”不再意味着“加1”。

    从表面上看,这听起来很荒谬 但我想不出更好的方法 有吗?

1 个答案:

答案 0 :(得分:1)

您实际上是在描述两种不同类型的迭代器:一种在递增时跳过默认值,另一种不递增。

因此,似乎API应该只提供一种向容器用户呈现任何一种类型的方法,以便用户可以从迭代器中选择他们想要的行为。