C ++:在类堆栈中使用deque成员函数

时间:2016-04-29 11:31:15

标签: c++ initialization deque

我在堆叠模板类堆栈中定义的双端队列对象时遇到问题。初始化类堆栈对象并在初始化对象上使用STL deque类的push_back()成员函数并读取堆栈内部的元素数量时,我得到零,但终端告诉我它将值推入其中。它看起来如下:

堆栈头文件

#ifndef STACK_HH 
#define STACK_HH

#include <iostream>
#include <deque>

template<class T>
class Stack {

    public: 
        Stack(): s() {   // <-- creating an empty deque s
            s.size() ;   
            nitems() ;
            empty() ;
        }

        ~Stack() {                          
            nitems() ;
            empty() ;
        }

        //Member functions
        int nitems() { return s.size() ; }
        bool empty() { return (s.size()==0) ; }

        void push_back(T c) {
            s[s.size()] = c ;  
        }

        T back() {
            return s[s.size()] ;  
        }

        void pop_back() { 
            if (empty()) {
                std::cout << "Stack::pop() Error: stack is empty" << std::endl ;
            }    
        }

    private:
        std::deque<T> s ;

};

#endif

主要脚本

#include <iostream>
#include <deque>
#include "Stack.h" 

using namespace std ;

// Main
int main() {

    int LEN = 10;

    Stack<double> s ;

    // Write doubles into Stack
    for (int i=0 ; i<LEN ; i++) {           
        cout << "pushing value " << i*i << " in stack s" << endl ;
        s.push_back(i*i) ;
    }

    // Count doubles in fifo
    cout << s.nitems() << " value(s) in stack" << endl ;

    return 0 ;
}

我想知道是否应该在我的Stack头文件中以不同方式定义deque push_back(),back()和pop_back()函数。类似于void deque&lt; T> :: push_back()和其他类似的。但这并没有解决它,因为我已经期待使用s.pushback()也不起作用。

非常感谢您解决此问题的任何帮助。

编辑:

谢谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

为什么不std::stack

分配给s[s.size()]不会添加新元素:

  

注释

     

与std :: map :: operator []不同,此运算符从不将新元素插入容器中。

来自http://en.cppreference.com/w/cpp/container/deque/operator_at

使用s.push_back(new_element)添加新元素。

最后一个元素是s[s.size() - 1],或者更好,s.back()

构造函数和析构函数中的

s.size()s.size()empty()不执行任何操作。

答案 1 :(得分:1)

您确实可以直接使用deque这样的方法:

template<class T>
class Stack {

    public: 
        Stack(): s() {   // <-- creating an empty deque s
        }

        ~Stack() {                          
        }

        //Member functions
        int nitems() const { return s.size() ; }
        bool empty() const { return s.empty() ; }

        void push_back(const T& c) {
            s.push_back(c) ;  
        }

        const T& back() {
            return s.back();  
        }

        void pop_back() { 
            if (empty()) {
                std::cout << "Stack::pop() Error: stack is empty" << std::endl ;
            }
            s.pop_back();
        }

    private:
        std::deque<T> s ;
};