2010-11-06 18 views
8

वेक्टर, सूची, डेक के लिए Inserters std :: back_inserter है और सेट में std :: inserter है।एसटीएल स्टैक और प्राथमिकता_क्यू

स्टैक और प्राथमिकता_क्यू के लिए मैं मानता हूं कि समकक्ष इंसर्टर एक पुश होगा() लेकिन मुझे कॉल करने के लिए सही फ़ंक्शन नहीं मिल रहा है।

मेरे इरादे सही डालने इटरेटर के साथ निम्न फ़ंक्शन का उपयोग करने में सक्षम होना है:

#include <string> 
#include <queue> 
#include <iterator> 

template<typename outiter> 
void foo(outiter oitr) 
{ 
    static const std::string s1 ("abcdefghji"); 
    static const std::string s2 ("1234567890"); 
    *oitr++ = s1; 
    *oitr++ = s2; 
} 

int main() 
{ 
    std::priority_queue<std::string> spq; 
    std::stack<std::string> stk; 

    foo(std::inserter(spq)); 
    foo(std::inserter(stk)); 

    return 0; 
} 

उत्तर

4

आप हमेशा अपने अपने तरीके से जाने के लिए और एक इटरेटर खुद को लागू कर सकते हैं। मैंने इस कोड को सत्यापित नहीं किया है लेकिन इसे काम करना चाहिए। "मैंने सत्यापित नहीं किया है" पर जोर

template <class Container> 
    class push_insert_iterator: 
    public iterator<output_iterator_tag,void,void,void,void> 
{ 
protected: 
    Container* container; 

public: 
    typedef Container container_type; 
    explicit push_insert_iterator(Container& x) : container(&x) {} 
    push_insert_iterator<Container>& operator= (typename Container::const_reference value){ 
    container->push(value); return *this; } 
    push_insert_iterator<Container>& operator*(){ return *this; } 
    push_insert_iterator<Container>& operator++(){ return *this; } 
    push_insert_iterator<Container> operator++ (int){ return *this; } 
}; 

मैं भी निम्नलिखित समारोह में जोड़ते हैं वह मदद करने के लिए इसका इस्तेमाल करते हैं:

template<typename Container> 
push_insert_iterator<Container> push_inserter(Container container){ 
    return push_insert_iterator<Container>(container); 
} 
+2

तो आप जो कह रहे हैं वह यह है कि std :: back_inserter या std :: inserter जैसे मानक नहीं हैं - संक्षेप में आपका उत्तर बहुत अच्छा है और मैं वर्तमान में क्या कर रहा हूं ... बस उम्मीद थी कि मुझे stl में कुछ याद आया था - जब मैं पहले से ही stl –

+0

@sonicoder में कुछ नहीं जानता हूं, तो मुझे खुद को रोल करना पसंद नहीं है। मैं केवल ओस्ट्रीम के अलावा सामने, पीछे, और नियमित डालने वालों को जानता हूं। आप बूस्ट को देख सकते हैं लेकिन मेरा मानना ​​है कि ये आपको जो भी चाहिए उसे चाहते हैं। – wheaties

+0

मुझे लगता है कि यह होना चाहिए: std :: iterator

2

अन्य वैकल्पिक (सरल) सिर्फ अंतर्निहित डेटा संरचना का उपयोग करने है (std :: ढेर आमतौर पर कार्यान्वित किया जाता है std :: डेक का उपयोग करके) और स्वीकार करें कि आपको उदाहरण का उपयोग करना है पुश() के बजाय push_back()। अपने स्वयं के इटरेटर को कोड करने से बचाता है, और विशेष रूप से कोड की स्पष्टता को प्रभावित नहीं करता है। std :: स्टैक स्टैक अवधारणा को मॉडलिंग के लिए आपकी एकमात्र पसंद नहीं है।