如何在其中构造一个带有成员函数的双端队列类? C++

Posted

技术标签:

【中文标题】如何在其中构造一个带有成员函数的双端队列类? C++【英文标题】:How to construct a deque class w/ member functions in it? 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 上了解了一些有关矢量的基本信息。 【参考方案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 中处理数据的方式来提高效率。 我明白你的意思。不过,效率并不是我在这个项目中真正关心的问题之一。在我先完成整个事情后,我会尝试更改它,但是谢谢 :))

以上是关于如何在其中构造一个带有成员函数的双端队列类? C++的主要内容,如果未能解决你的问题,请参考以下文章

Python 类型提示填充了 myclass 对象的双端队列

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

STL 中的双端队列到底是啥?

STL中的双端队列

最小化 map<string, string> 的双端队列中连续相等提取的数量

检查数组是不是在数组的双端队列中? Python