【问题标题】:How to construct a deque class w/ member functions in it? C++如何在其中构造一个带有成员函数的双端队列类? C++
【发布时间】:2017-01-24 22:31:21
【问题描述】:

我是 C++ 新手,我的教授要求我们构建一个 Deque 类以及其他几个类,例如 Stack 和 Queue。

以下是我到目前为止所做的。

我的问题是:如何构造/制作一个函数并使其工作?例如,你怎么能在这里创建一个 push_front(int) 函数? (其实不用模板,用int就可以了。)

只有一个例子就足以让我弄清楚下一步该做什么。

非常感谢帮助。

#ifndef CLASSES_H
#define CLASSES_H

#include <vector>
#include <iostream>
class Deque{
public:
    void push_front(int); //Insertion from left
    void push_back(int x){m_Vector.push_back(x);};//Insertion from right
    void pop_front();//Remove from left
    void pop_back(){m_Vector.pop_back();};//Remove from right
    int getL()const {return m_left;}
    int getR()const {return m_right;}
protected:
    //Protected Data members
    int m_left;
    int m_right;
    unsigned int size;
    unsigned int length;
    vector<int> m_Vector;
//structure  
};
// Deque member functions definitions


class Queue:private Deque{
public:
    void insertL(int a){push_front(a);};
    int removeR(){return pop_back();};
};

class Stack:private Deque{
public:
    void push(int x){push_front(x);};
    int pop(){return pop_front();};
    bool full(){return m_left == m_right;}
protected:
    using Deque::m_left;
    using Deque::m_right;
};


#endif /* CLASSES_H */

更新:

我只是做了一个这样的小功能,

void Deque::push_front(int x){
    m_Vector.insert(m_Vector.begin(),x);
}

我把它放在 Deque 类之后。有人能告诉我我做得对吗?

第二次更新:

我的 pop_front 是这样完成的。

void Deque::pop_front(){
    m_Vector.front() = std::move(m_Vector.back());
    m_Vector.pop_back();
}

【问题讨论】:

  • 是否指示您使用 vector 作为基础数据存储?
  • 是的,我在 google 上了解了一些有关矢量的基本信息。

标签: c++ function class vector deque


【解决方案1】:

push_frontvector 上的效率非常低,您通常应该避免使用它。 (您必须移动向量的每个元素才能做到这一点)。

鉴于您有m_leftm_right,我假设您的教授希望您在向量中创建一个循环缓冲区。这根本不涉及push_back 或任何类似函数,因为实际数据值可能是整体数据的某个子集,并且数据的正面和背面可能位于任意索引处,不一定是vector 的结尾.

你的StackQueue 看起来不错,一旦你实现了Deque 的功能。

将循环缓冲区作为一个主题进行研究,网上有很多解释它们是如何工作的,对于许多工作负载而言,它们在单个操作的基础上效率要高得多,但在空间使用方面具有奇怪的属性,而且访问成本更高,因此不提供向量中的默认值。

我建议您在这 4 种方法方面花时间举例说明,尤其是在边界条件方面。

【讨论】:

  • 感谢您回答我的问题。我的教授也需要push_front/backpop_front/back函数。我知道push_front 效率低下,但我只需要创建一个以这种方式工作的函数。
  • @XinzeWang:将它们命名相同会造成混淆。您的push_back 不必使用矢量的push_backvector.push_back 效率低下,你的不需要。有一些方法可以通过单独使用 vector 作为数据存储机制来改变您在 vector 中处理数据的方式来提高效率。
  • 我明白你的意思。不过,效率并不是我在这个项目中真正关心的问题之一。在我先完成整个事情后,我会尝试更改它,但是谢谢 :))
猜你喜欢
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2011-12-07
相关资源
最近更新 更多