Ara*_*raK 15
我已经编写了一个代码片段来进行调试.例如:
std::stack<int> s; // works with std::queue also!
s.push(1);
s.push(2);
std::cout << s; // [ 1, 2 ]
Run Code Online (Sandbox Code Playgroud)
请原谅我这个hackish代码!但这是我几个月前写的:
#include <stack>
#include <queue>
#include <ostream>
template <class Container, class Stream>
Stream& printOneValueContainer
(Stream& outputstream, const Container& container)
{
typename Container::const_iterator beg = container.begin();
outputstream << "[";
while(beg != container.end())
{
outputstream << " " << *beg++;
}
outputstream << " ]";
return outputstream;
}
template < class Type, class Container >
const Container& container
(const std::stack<Type, Container>& stack)
{
struct HackedStack : private std::stack<Type, Container>
{
static const Container& container
(const std::stack<Type, Container>& stack)
{
return stack.*&HackedStack::c;
}
};
return HackedStack::container(stack);
}
template < class Type, class Container >
const Container& container
(const std::queue<Type, Container>& queue)
{
struct HackedQueue : private std::queue<Type, Container>
{
static const Container& container
(const std::queue<Type, Container>& queue)
{
return queue.*&HackedQueue::c;
}
};
return HackedQueue::container(queue);
}
template
< class Type
, template <class Type, class Container = std::deque<Type> > class Adapter
, class Stream
>
Stream& operator<<
(Stream& outputstream, const Adapter<Type>& adapter)
{
return printOneValueContainer(outputstream, container(adapter));
}
Run Code Online (Sandbox Code Playgroud)
您可以流式传输std::stack,std::queue就像任何其他支持的类型一样!
您无法遍历堆栈或队列.实际上,SGI的文档说明了这一点(它是关于堆栈的,但它与队列的原因相同):
这种限制是堆栈存在的唯一原因.请注意,任何前插入序列或后插入序列都可以用作堆栈; 例如,在vector的情况下,堆栈操作是成员函数back,push_back和pop_back.使用容器适配器堆栈的唯一原因是明确表示您只执行堆栈操作,而不执行其他操作.
所以,如果你真的想这样做,你将不得不清空堆栈(或队列):
std::stack<Whatever> s;
// ...
while(!s.empty())
{
Whatever w = s.top();
std::cout << w;
s.pop();
}
Run Code Online (Sandbox Code Playgroud)
小智 5
ostream & operator<<(ostream & os, stack<double> my_stack) //function header
{
while(!my_stack.empty()) //body
{
os << my_stack.top() << " ";
my_stack.pop();
}
return os; // end of function
}
/*
using this simple overloaded operator function, you're able to print out all the components of a stack by doing a simple cout << your_stack_name;*/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58023 次 |
| 最近记录: |