如何方便地打印出std :: stack或std :: queue中的所有元素

Qia*_* Li 14 c++

如果我不想创建一个新容器才能这样做?

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就像任何其他支持的类型一样!

  • 很好的说明,但代码实际上是标准的,并不依赖于特定的实现.标准说底层容器是"受保护的"!这段代码的工作方式是它继承了std :: stack(或std :: queue),然后暴露了底层容器.请检查问题本身下的评论以获得一个想法. (2认同)

Eti*_*tel 9

您无法遍历堆栈或队列.实际上,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)

  • 然后,使用向量(用于堆栈)或双端队列(用于队列).堆栈和队列适用于非常特定的情况. (4认同)

小智 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)

  • @Ramakrishnan:不。他通过副本而不是引用来获取堆栈。 (4认同)
  • 您将丢失堆栈中的所有元素。 (3认同)