2010-11-06 5 views
8

Vektor, Liste, Deque haben std :: back_inserter und Set hat std :: Inserter.Kuvertiermaschinen für STL-Stack und priority_queue

Für Stapel und priority_queue würde ich die equivelent Inserter einen push() wäre davon ausgehen, aber ich kann nicht scheinen, um die korrekte Funktion zu finden, anzurufen.

Meine Absicht ist es, die folgende Funktion mit dem richtigen Insert-Iterator in der Lage sein zu verwenden:

#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; 
} 

Antwort

4

Sie können jederzeit Ihren eigenen Weg gehen und einen Iterator selbst implementieren. Ich habe diesen Code nicht verifiziert, aber es sollte funktionieren. Schwerpunkt auf "Ich habe nicht überprüft."

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; } 
}; 

ich auch in der folgenden Funktion hinzufügen, würde es helfen, zu verwenden:

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

Also was Sie sagen, ist, dass es keine Standard-wie Std :: Back_Inserter oder Std :: Inserter - kurz gesagt, Ihre Antwort ist ziemlich gut und was ich gerade mache ... nur gehofft, dass ich hatte etwas in der stl verpasst - nicht mag meine eigene Ausrollen, wenn es schon etwas in der stl –

+0

@sonicoder ist nicht, dass ich wüsste. Ich kenne nur Front-, Back- und normale Inserter neben denen von Ostream. Sie könnten sich Boost anschauen, aber ich glaube, dass sogar diese Ihnen Lust auf das geben werden, was Sie brauchen. – wheaties

+0

Ich denke, es sollte sein: std :: iterator

2

Die andere Alternative (einfacher) ist die zugrunde liegende Datenstruktur nur zu verwenden (std :: Stapel in der Regel implementiert mit std :: deque) und akzeptieren, dass Sie zB verwenden müssen push_back() statt push(). Speichert mit Ihrem eigenen Iterator codieren, und nicht besonders beeinträchtigt die Klarheit des Codes. std :: stack ist nicht die einzige Wahl für die Modellierung des Stack-Konzepts.