我在堆叠模板类堆栈中定义的双端队列对象时遇到问题。初始化类堆栈对象并在初始化对象上使用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()也不起作用。
非常感谢您解决此问题的任何帮助。
编辑:
谢谢大家的帮助。
答案 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 ;
};