我一直在尝试实现一个迭代器到我的栈,像这样:
#include <iostream>
#include <stack>
#include <deque>
template <typename T, class container=std::deque<T>>
class MutantStack : public std::stack
{
public:
MutantStack(){}
~MutantStack(){}
MutantStack(const MutantStack &stack)
{
*this = stack;
}
typedef typename std::deque::iterator iterator;
};
但是我不能做一个开始和结束迭代器,我怎么能做呢?另一个问题是deque迭代器中的c.begin()是什么意思,我找到了这个例子:
iterator begin()
{
return this->c.begin();
}
2条答案
按热度按时间tnkciper1#
我不确定你是否选择了正确的方法。
因为,首先你可以使用
std::deque
,它提供了栈所提供的所有功能,甚至更多。因此,可能最好使用
std::deque
或std::vector
。另外,从标准容器派生不是最好的主意。您可以在SO上阅读到这方面的内容。
但是如果你想在特殊情况下这样做,那么只需要取
top()
的地址,这将是底层容器中的最后一个元素,如果你减去堆栈的size()
(修正为1),那么你就有了一个指向底层容器开始的指针。然后,您可以使用人工迭代器和下标运算符
[]
。请参见以下示例:
看起来我们找到了您想要的内容,但实际上,我们只是在底层容器上工作。
mzillmmw2#
经过一番研究,我发现这个解决方案:
stack对象继承自
deque
类型,如下所示:但它只公开了几个方法,例如:
pop push empty swap
和emplace
,所以它也有deque
迭代器,所以我就像上面一样使用它,c.begin()
和c.end()
中的c
是一个在栈类中定义的container_type:这意味着
c
是容器,当输入c.begin()
时,我们得到Mutantstack中的第一个值;就像在数组上写value[0]
,现在我的MutantStack类继承自std::stack
类,而std::stack
类本身继承自std::deque
类: