如何从堆栈构造或返回底层deque?

Bee*_*and 6 c++

我希望能够将std :: stack <>转换为std :: deque <>.有直接的转换吗?

Mik*_*our 17

可以在不复制数据的情况下访问底层容器,但它需要一定数量的恶意.容器被暴露为受保护的成员,称为c,允许这样的恶作剧:

template <typename T>
class Shenanigans : private stack<T>
{
public:
    explicit Shenanigans(stack<T>& victim) : victim(victim)
    {
        swap(victim);
    }

    ~Shenanigans()
    {
        swap(victim);
    }

    using stack<T>::c;

private:
    stack<T>& victim;
};

int main()
{
    stack<int> s;
    s.push(42);

    {
        Shenanigans<int> sh(s);
        // The deque is accessible as sh.c, but the stack is temporarily empty.
        cout << "Size: " << s.size() << " Data: " << sh.c.front() << "\n";
    }

    // The stack is restored.
    cout << "Size: " << s.size() << " Data: " << s.top() << "\n";
}
Run Code Online (Sandbox Code Playgroud)

当然,更好的解决方案是选择满足您需求的容器.

  • +1:我不知道要求将容器存储为名为`c`的受保护成员. (2认同)

R S*_*hko 6

你需要手动完成:

while (!stk.empty())
{
    deq.push_back(stk.top());
    stk.pop();
}
Run Code Online (Sandbox Code Playgroud)

  • @Stephen:除了'deque`之外没有这样的功能.:) (5认同)