【问题标题】:C++ - Circular array with lower/upper bounds?C++ - 具有下限/上限的圆形数组?
【发布时间】:2009-03-03 20:45:08
【问题描述】:

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

一个典型的圆形数组可能看起来像:

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

谢谢!

注意:不能使用外部库。

【问题讨论】:

  • 你能扩展你的解释吗?好像你想要一个循环队列的循环队列。在这种情况下,每个队列在单独的数组中会更好。

标签: c++ c math


【解决方案1】:

一般的数学术语:

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

其中 === 是“全等”运算符。将其转换为模运算符,它将是:

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

您可以自行确定每个项目的上限和下限。您可以将其存储在二叉树中以便快速检索。可能我没听懂你的问题。

(注意这里假设lower 0)

【讨论】:

    【解决方案2】:
              +=======+        +=======+        +=======+
              |  Obj  | --->   |  Obj  |  --->  |  Obj  |
    buffer    |   1   | <---   |   2   |  <---  |   3   |
              +=======+        +=======+        +=======+  
    
    index       0                  1                2        /* our first run */
    
    index       3                  4                5        /* second run */
    
    and so on ...
    

    所以,对于 3 个成员列表,第一个项目由 0, 3, 6, 等索引。类似地,第二个项目由 1, 4 (1 + 3), 7 (4 + 3), ... 索引

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

    使用这个公式我们得到:

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

    希望有帮助

    【讨论】:

      【解决方案3】:

      几年前我写了这篇关于循环 STL 迭代器的文章。

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

      它适用于任何 STL 集合(向量和 boost:array 等)

      【讨论】:

        【解决方案4】:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-05
          • 2019-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多