双端队列索引

时间:2011-02-15 16:06:41

标签: c++

所以,我现在已经敲了三天左右,试图想办法让它发挥作用。

我的任务是编写一个双端队列。我对那部分没有任何疑问。

我遇到的问题是,当给定一个索引时,我们必须让括号运算符工作。

所以,如果我输入6,我想得到[2] [2]等等。但是,我不知道哪个方程式可行。

我已经尝试了所有的东西,我用谷歌搜索过,我已经向在课堂上的人们寻求过帮助,这在课堂上从来没有做过,所以没有帮助。没有人讨论这个问题,每个人似乎只是使用二维而不是搞乱一个索引。

我知道这个等式可能非常简单,但到期日是星期五早上,我仍然需要调试它并运行单元测试。

以下是将用于的功能:

template<typename generic>
generic& Deque<generic>::operator[](unsigned int p)
{
  return m_data[dq_index]->operator[](block_index);
}

类别:

#include<stdexcept>
using std::out_of_range;
#include "block.h"

template<typename generic>
class Deque
{
 public:
  Deque();
  Deque(unsigned int n);
  Deque(Deque& d);
  ~Deque();
  void push_front(generic x);
  void pop_front();
  void push_back(generic x);
  void pop_back();
  void clear();
  Deque& operator=(const Deque& d);
  generic& operator[](unsigned int p);
  const generic& operator[](unsigned int p) const;
  unsigned int size() const;
  unsigned int block_size() const;
  bool empty() const;

 private:
  Block<generic>** m_data;
  unsigned int m_size;
  unsigned int m_blocks;
  unsigned int m_block_size;
};

作业:http://web.mst.edu/~buechler/datastructures/dequeclass.htm

3 个答案:

答案 0 :(得分:1)

您正在寻找的公式应该是这样的:

template<typename generic>
generic& Deque<generic>::operator[](size_t p)
{
  size_t dq_index = p / m_block_size;
  size_t block_index = p % m_block_size;

  return m_data[dq_index]->operator[](block_index);
  // return m_data[dq_index][block_index];  should be equivalent to the above
}

评论:我对这里的教学法感到有些恼火。您的教师希望您使用特定的实现技术(块结构可调整大小的数组)对双端队列进行编码,这很好,但是他们没有费心去解释分配的哪些部分是“实现deque”,哪些是“实现一个块结构的可调整大小的数组“。因此,你向我们提出了一个关于块结构部分的问题,但你称之为deque问题,因为这就是你所知道的,所以我们感到困惑。

Nitpick 1:operator[]采用size_t类型的参数。不是unsigned int。你的block.h和deque.h中unsigned int的每个实例都应该是size_t,你可以告诉你的导师我是这么说的。 (您可能需要在两个文件中的#include <cstddef>上方添加#include <stdexcept>。)

Nitpick 2:从不using指令放在头文件的顶层;当你这样做时,你会踩到includer的命名空间。这适用于您的.h接口文件和.hpp实施文件,因为它们最终都会获得#include d。您可以将using指令放在每个需要它们的函数的开头,或者您可以使用限定名称(std::whatever) - 我会选择以每个函数为基础的较少的键入。同样,这是您的导师所犯的错误,您可以告诉他们我这么说。

答案 1 :(得分:0)

很抱歉,但我没有很好地回答你的问题,但从我能理解你想问的是:

  

如果是的话,如何得到6 = [2] [2]   索引权...它很简单,在   计算机全部以0 NOT 1开头,   因此在处理一系列说法时   X * 3

  • [0] [0] = 0

  • [0] [1] = 1

  • [0] [2] = 2

  • [1] [0] = 3

  • [1] [1] = 4

  • [1] [2] = 5

  • [2] [2] = 6

  • [3] [0] = 7

  • ......等等。

  

因此阵列可能是   引用为A [2] [2]或(A + 6),其为   同样的事情,而且A [x] [y]   只是一种更好的格式   可读性和保持小   数字方面,我的意思是有   你需要处理的情况   1000个值的数组:)

希望这对你有所帮助,但如果它不让我知道,我很乐意帮助你。

答案 2 :(得分:0)

给定索引I,找到块B:

B = I / m_block_size;

然后,在块B中找到索引X:

X = I%m_block_size;

因此,给定索引I,您应该访问m_data [B] [X]。