2011-02-15 45 views
1

所以,我一直在敲我的头大约三天,现在试图找出如何让这个工作。双端队列索引

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

,我遇到了这个问题的事实是,给定一个指标时,我们必须有支架运营工作。所以,如果我把6放在后面,我想要[2] [2]回来,等等。但是,我不知道什么方程会起作用。

我已经尝试了一切,我GOOGLE了它,我已要求从谁已经在类人的帮助,这之前从未在课堂上这样做没有帮助那里。没有人讨论过这个问题,每个人似乎都使用二维而不是搞乱一个索引。

我知道方程可能是很简单,但在到期日是星期五的早晨,我还是要调试和运行单元测试。

这里是它会在被使用的功能:

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

+1

你能否发布`Deque`的类定义?你的问题意味着约束不属于deque的基本定义的一部分,所以我们需要看到更多你正在使用的东西。 – zwol 2011-02-15 16:16:09

+3

双重结局与两个维度无关,我不理解“我把6放到了我想得到[2] [2]回来”的部分。任何机会的任务确切的措辞? – Steve314 2011-02-15 16:16:37

+0

[2] [2]就像块2,索引2. – user618137 2011-02-15 16:21:03

回答

0

很抱歉,但我没有得到你的问题非常好,但从我能理解你想要问的是:

如何先得6 = [2] [2]中的 索引右壳体...它相当简单,在 计算机,这一切以说的阵列处理时从0开始不为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 阵列,但如果它不只是让我知道,我会很高兴 来帮你。

+0

如果我理解你说的正确,这不完全是我的任务。他希望它能够扩展索引并隐藏真正的索引。所以,说我有两个“块”,他想要一个前推,它在前面添加一个新块,将信息放入[0,3],放入索引为0,然后进入螺丝与其余的指标。 – user618137 2011-02-15 17:06:14

0

鉴于索引I,以找到块B:

B = I/m_block_size;

然后,找到块B内的索引X:

X = I%m_block_size;

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

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”,哪个部分是“实现一个块结构的可调整大小的数组“。因此,您会遇到一个关于块结构部分的问题,但您称之为deque问题,因为这是您所知道的,所以我们会感到困惑。

Nitpick 1:operator[]需要size_t类型的参数。不是unsigned int。您的block.h和deque.h中的每个unsigned int应该是size_t,并且您可以告诉您的教师我说过。 (您可能需要添加#include <cstddef>略高于这两个文件#include <stdexcept>

鸡蛋里挑骨头2:NEVERusing指令在头文件的顶部水平;当你这样做时,你会踩踏包含者的命名空间。这适用于您的.h接口文件和您的.hpp实施文件,因为它们都会变成#include d。您可以将using指令放在每个需要它们的函数的开头,或者您可以使用限定名称(std::whatever) - 我将根据每个函数选择哪一种更少。再一次,这是你的导师所犯的一个错误,你可以告诉他们我说的是这样。