C++:在 class 堆栈中使用双端队列成员函数

C++: using deque member functions inside a class stack

我在为模板 class 堆栈中定义的双端队列对象堆叠值时遇到问题。当初始化一个 class 堆栈对象并在初始化对象上使用 STL 双端队列 class 的 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 头文件中以不同方式定义双端队列 push_back()、back() 和 pop_back() 函数。类似 void deque < T > ::push_back() 的东西和其他类似的东西。但这并没有解决它,因为我已经预料到了,但是使用 s.pushback() 也不起作用。

如能帮助解决此问题,我们将不胜感激。

编辑:

谢谢大家的帮助。

为什么不std::stack


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

Notes

Unlike std::map::operator[], this operator never inserts a new element into the container.

来自 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() 在构造函数和析构函数中什么都不做。

你确实可以像这样直接使用 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 ;
};