2011-02-15 43 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) - 我將根據每個函數選擇哪一種更少。再一次,這是你的導師所犯的一個錯誤,你可以告訴他們我說的是這樣。