Как я могу создать или возвратить базовую двухстороннюю очередь из стека?

Я хочу смочь преобразовать станд.:: стек <> к станд.:: двухсторонняя очередь <>. Существует ли простое преобразование?

6
задан BeeBand 13 June 2010 в 18:55
поделиться

4 ответа

Вам нужно будет сделать это вручную:

while (!stk.empty())
{
    deq.push_back(stk.top());
    stk.pop();
}
6
ответ дан 8 December 2019 в 03:38
поделиться

Можно получить доступ к базовому контейнеру без копирования данных, но это требует определенного зла. Контейнер представлен как защищенный элемент, называемый 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";
}

Конечно, гораздо, гораздо лучшим решением является выбор контейнера, который соответствует вашим потребностям.

17
ответ дан 8 December 2019 в 03:38
поделиться

Я думаю, что если вам это нужно, лучше в первую очередь использовать deque вместо стека. Невозможно получить доступ к базовому хранилищу, используемому адаптером стека, если это то, о чем вы спрашиваете.

2
ответ дан 8 December 2019 в 03:38
поделиться

Вам нужно вытолкнуть все элементы из стека в другой контейнер.

Если вам нужно это сделать, возможно, std::stack является неправильной структурой данных для вашего случая использования.

3
ответ дан 8 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: