2009-02-08 9 views

उत्तर

34

स्टैक में स्टैक की परिभाषा के अनुसार इटरेटर नहीं हैं। यदि आपको इटरेटर के साथ ढेर की आवश्यकता है, तो आपको इसे अन्य कंटेनर (std :: list, std :: vector, आदि) के शीर्ष पर लागू करने की आवश्यकता होगी। Stack doc is here

पीएस एक टिप्पणी के अनुसार मैं इराइंबिलानजा से मिला, std :: स्टैक डिफ़ॉल्ट रूप से कार्यान्वयन के लिए std :: डेक का उपयोग करता है।

+2

+1। ध्यान दें कि डिफ़ॉल्ट रूप से std :: stack std :: deque को इसके कार्यान्वयन के रूप में उपयोग करता है, इसलिए यह एक iterstack के डिफ़ॉल्ट कार्यान्वयन के लिए भी एक अच्छा विकल्प हो सकता है। एक और सवाल यह है कि, * क्यों * आप एक हड़ताली ढेर चाहते हैं और नहीं, एक सीधे डेक –

+0

10x, मुझे नहीं पता था कि – Drakosha

1

SGI, MSDN और GNU दस्तावेज, stack एक पुनरावर्तक प्रदान नहीं करता है।

10

यदि आपको इटरेटर के साथ एक स्टैक की आवश्यकता है, तो आपके पास दो विकल्प हैं। push_back(), pop_back() का उपयोग कर std :: वेक्टर। std :: डेक या तो 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 
संबंधित मुद्दे