Я хочу смочь преобразовать станд.:: стек <> к станд.:: двухсторонняя очередь <>. Существует ли простое преобразование?
Вам нужно будет сделать это вручную:
while (!stk.empty())
{
deq.push_back(stk.top());
stk.pop();
}
Можно получить доступ к базовому контейнеру без копирования данных, но это требует определенного зла. Контейнер представлен как защищенный элемент, называемый 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";
}
Конечно, гораздо, гораздо лучшим решением является выбор контейнера, который соответствует вашим потребностям.
Я думаю, что если вам это нужно, лучше в первую очередь использовать deque вместо стека. Невозможно получить доступ к базовому хранилищу, используемому адаптером стека, если это то, о чем вы спрашиваете.
Вам нужно вытолкнуть все элементы из стека в другой контейнер.
Если вам нужно это сделать, возможно, std::stack
является неправильной структурой данных для вашего случая использования.