Содержит ли стек в C++ STL любые итераторы базового контейнера или я должен использовать этот контейнер напрямую?Выводит ли std :: stack итераторы?
29
A
ответ
34
Стек не имеет итераторов по определению стека. Если вам нужен стек с итераторами, вам нужно реализовать его самостоятельно поверх другого контейнера (std :: list, std :: vector и т. Д.). Stack doc is here.
P.S. Согласно комментарию, полученному от Iraimbilanja, std :: stack по умолчанию использует std :: deque для реализации.
1
10
Если вам нужен стек с итераторами, у вас есть два варианта. std :: vector, используя push_back(), pop_back(). std :: deque с помощью push_back()/pop_back() или push_front()/pop_front().
0
std::stack
делает его подстилающий контейнер (и, следовательно, итераторы) до подклассами через его защищенный интерфейс. Поэтому, если вы хотите получить к ним доступ, вы можете немного расширить std::stack
.
template<typename T, typename Container = std::deque<T>>
class iterable_stack
: public std::stack<T, Container>
{
using std::stack<T, Container>::c;
public:
// expose just the iterators of the underlying container
auto begin() { return std::begin(c); }
auto end() { return std::end(c); }
auto begin() const { return std::begin(c); }
auto end() const { return std::end(c); }
};
int main()
{
iterable_stack<int> st;
st.push(2);
st.push(5);
st.push(3);
st.push(7);
st.push(9);
for(auto i: st)
std::cout << i << ' ';
std::cout << '\n';
}
Выход:
2 5 3 7 9
+1. обратите внимание также, что std :: stack по умолчанию использует std :: deque как свою реализацию, поэтому это может быть хорошим выбором для стандартной реализации iterstack по умолчанию. Другой вопрос: * почему * вы хотите итерируемый стек, а не, скажем, прямой deque – 2009-02-08 08:18:09
10x, я не знал, что – Drakosha