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 ;
};
我在为模板 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 ;
};