C ++ - 具有下限/上限的圆形数组?

时间:2009-03-03 20:45:09

标签: c++ c math

我想创建一个类似于双链表(但有数组)的东西,它与下限/上限一起使用。

典型的圆形阵列可能如下所示:

next = (current + 1) % count;
previous = (current - 1) % count;

但是,将下限/上限正确地纳入其中的数学运算是什么?

  • 0(下界第1项)
  • 1
  • 2(上限项目1)
  • 3(下界第2项)
  • 4(上限项目2)

那样:

- >项目1的索引2上的下一个返回0

- >项目1的索引0上的前一个返回2

- >项目2的索引4上的下一个返回3

- >项目2的索引3上的前一个返回4

谢谢!

注意:无法使用外部库。

4 个答案:

答案 0 :(得分:6)

一般数学术语:

next === current + 1 (mod count)
prev === current - 1 (mod count)

其中===是'congruent'运算符。将其转换为模数运算符,它将是:

count = upper - lower
next = ((current + 1 - (lower%count) + count) % count) + lower
prev = ((current - 1 - (lower%count) + count) % count) + lower

你应该找出上面的&每个项目的下限。您可以将其存储在二叉树中以便快速检索。也许我不理解你的问题。

(请注意,这假设较低的< upper,且较低的> 0)

答案 1 :(得分:5)

          +=======+        +=======+        +=======+
          |  Obj  | --->   |  Obj  |  --->  |  Obj  |
buffer    |   1   | <---   |   2   |  <---  |   3   |
          +=======+        +=======+        +=======+  

index       0                  1                2        /* our first run */

index       3                  4                5        /* second run */

and so on ...

因此,您看到3个成员列表,第1个项目由0, 3, 6,等索引。同样,第2个项目由1, 4 (1 + 3), 7 (4 + 3), ...索引

一般规则是:next <- (next + 1) % size,其中size = upper - lower + 1

使用这个公式我们得到:

  curr |      next  
-------+-----------------
   0   | (0 + 1) % 3 = 1
-------+-----------------
   1   | (1 + 1) % 3 = 2
-------+-----------------
   2   | (2 + 1) % 3 = 0
-------+-----------------

希望有所帮助

答案 2 :(得分:3)

几年前我写了一篇关于圆形STL迭代器的文章。

http://noveltheory.com/Iterators/Iterator_N0.htm

它适用于任何STL集合(矢量&amp; boost:数组等)

答案 3 :(得分:1)

Boost有一个Circular container,我相信你也可以设置界限。

事实上,该页面上的示例与您在此处所说的内容非常相似。

但无论如何,你可以使用模数轻松完成数学部分:

所以说你的最大值是3:

int MAX = 3;
someArray[ 0 % MAX ]; // This would return element 0
someArray[ 1 % MAX ]; // This would return element 1
someArray[ 3 % MAX ]; // This would return element 0
someArray[ 4 % MAX ]; // This would return element 1