为什么要分配大小超过请求大小的数组?

时间:2015-03-27 16:31:33

标签: c++

这真的很有趣,因为我们的导师昨天正在向我们讲这个,他自己也无法弄明白。所以,我们在不知道实际原因的情况下还有点悬而未决。

以下是一本着名书籍中的队列的数组实现(我没有,但这是我的导师所说的。作者非常有名):

class QUEUE {
private:
    int* q;
    int N;
    int head;
    int tail;
public:
    QUEUE(int maxN) {
        q = new int[maxN + 1];
        N = maxN + 1; head = N; tail = 0;
    }
    int empty() const {
        return head % N == tail;
    }
    void put(int item) {
        q[tail++] = item; tail = tail % N;
    }
    int get() {
        head = head % N; return q[head++];
    }
};

在构造函数中,您会看到q = new int[maxN + 1];。但为什么' + 1' ?他为什么要分配一个额外的int内存块?

1 个答案:

答案 0 :(得分:6)

maxN添加一个解决方案的问题是,如果您准确分配maxN项,则无法区分这两种情况:

  • 队列为空,
  • 队列中有maxN个项目。

在这两种情况下,headtail将彼此模等N

注意:实现并不理想,因为插入maxN+1 - 元素包裹队列,因此它再次变为空。这个缺点可以通过三种方式解决:

  • 队列溢出时抛出异常,
  • 将返回类型更改为bool,忽略溢出队列的插入,如果忽略插入则返回false,或
  • 无声地忽略溢出队列的插入(不推荐)。