2009-02-08 2 views

ответ

34

Стек не имеет итераторов по определению стека. Если вам нужен стек с итераторами, вам нужно реализовать его самостоятельно поверх другого контейнера (std :: list, std :: vector и т. Д.). Stack doc is here.

P.S. Согласно комментарию, полученному от Iraimbilanja, std :: stack по умолчанию использует std :: deque для реализации.

+2

+1. обратите внимание также, что std :: stack по умолчанию использует std :: deque как свою реализацию, поэтому это может быть хорошим выбором для стандартной реализации iterstack по умолчанию. Другой вопрос: * почему * вы хотите итерируемый стек, а не, скажем, прямой deque – 2009-02-08 08:18:09

+0

10x, я не знал, что – Drakosha

1

В SGI, MSDN и GNU документация, stack не содержит итератора.

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