2017-01-24 16 views
0

Я новичок в C++, и мой профессор попросил нас построить класс Deque и несколько других классов, таких как Stack и Queue.Как построить класс deque с функциями-членами в нем? C++

Ниже приведено то, что я сделал до сих пор.

Мой вопрос: Как построить/сделать функцию и заставить ее работать? Например, как именно вы могли бы сделать функцию 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 */ 

UPDATE:

Я просто сделал небольшую функцию, как это,

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

И я положил его сразу после класса Deque. Может ли кто-нибудь сказать мне, правильно ли я делаю это?

второй UPDATE:

Я получил pop_front сделано, как это.

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

Вам было поручено использовать 'vector' в качестве основного хранилища данных? –

+0

Да Я узнал основную информацию об объекте в Google. –

ответ

1

push_front невероятно inefficent на vector вы должны вообще избегать. (Вы должны переместить каждый элемент вектора, чтобы сделать это).

Учитывая, что у вас есть m_left и m_right Я бы постулировал, что ваш профессор хотел, чтобы вы создали круговой буфер внутри вашего вектора. Это не включает push_back или любую аналогичную функцию вообще, так как фактические значения данных могут быть подмножеством общих, а передняя и задняя части ваших данных могут иметь произвольный индекс, не обязательно конец vector.

Ваши Stack и Queue выглядят прекрасно, хотя, как только вы реализуете функциональность Deque.

Исследование круговых буферов в качестве темы, есть много онлайн-объяснений, как они работают, они значительно более эффективны на основе отдельных операций для многих рабочих нагрузок, но имеют странные свойства вокруг их использования пространства и более дорогого доступа, поэтому не предоставляются как значение по умолчанию в векторе.

Я бы рекомендовал не торопиться с примерами, когда дело доходит до этих 4 методов, особенно когда речь идет о граничных условиях.

+0

Спасибо, что ответили на мой вопрос. Мой профессор сказал, что функции 'push_front/back' и' pop_front/back' также требуются. Я знаю, что 'push_front' неэффективен, но я просто должен создать функцию, которая работает именно так. –

+1

@XinzeWang: Именование их одинаково создает путаницу. Ваш 'push_back' не обязательно должен использовать вектор' push_back'. 'vector.push_back' неэффективен, вам не нужно. Есть способы сделать это эффективным благодаря изменениям, как вы обрабатываете свои данные в 'vector', используя« вектор »в качестве механизма хранения данных. – Guvante

+0

Я понял, что вы имеете в виду. Эффективность на самом деле не одна из моих проблем в этом проекте.Я постараюсь изменить его после того, как я все сделаю первым, но thx :)) –