Идиоматически перевернуть стек?

Стандартная библиотека C ++ пытается иметь как можно более единообразный интерфейс для всех своих контейнеров. Однако выделяется одна паршивая овца:

#include <algorithm>
#include <stack>

int main()
{
    std::stack<int> s;
    std::reverse(std::begin(s), std::end(s));
}

Я не могу использовать эту распространенную идиому для переворота контейнера, потому что стек - это не контейнер: это адаптер. В результате у него нет begin или end функций.

Мне нужно было бы сделать что-то вроде этого:

std::stack<int> s;
std::stack<int> s2;
while (!s.empty())
{
    s2.push(s.top());
    s.pop();
}
while (!s2.empty())
{
    s2.top(); // do something with it
    s2.pop();
}

Что это за «стандартный» способ? Пожалуйста, никаких специальных приемов или запутанных методов.


person uh oh somebody needs a pupper    schedule 05.05.2016    source источник
comment
Ваш код выглядит хорошо. В конце концов, просто std::swap(s, s2). Вы также можете просто использовать std::vector вместо std::stack, если вам нужно реверсирование на месте   -  person Niklas B.    schedule 05.05.2016
comment
Вы можете использовать эту хакерскую функцию получить контейнер. Тогда вы можете использовать std::reverse на нем.   -  person rozina    schedule 05.05.2016
comment
Я хотел бы указать вам на это: stackoverflow.com/questions/4115431/ и это: stackoverflow.com/questions/1723515/   -  person John Zwinck    schedule 05.05.2016