所以,我现在已经敲了三天左右,试图想办法让它发挥作用。
我的任务是编写一个双端队列。我对那部分没有任何疑问。
我遇到的问题是,当给定一个索引时,我们必须让括号运算符工作。
所以,如果我输入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
答案 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]。