2010-11-06 18 views
8

vector, lista, deque hanno std :: back_inserter e set ha std :: inserter.Inseritori per stack STL e priority_queue

Per stack e priority_queue, suppongo che l'inseritore equivoco sia un push() ma non riesco a trovare la funzione corretta da chiamare.

Il mio intento è quello di essere in grado di utilizzare la seguente funzione con la corretta iteratore inserto:

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

risposta

4

Si può sempre andare la tua strada e implementare un iteratore te stesso. Non ho verificato questo codice ma dovrebbe funzionare. Enfasi su "Non ho verificato".

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

Vorrei anche aggiungere la seguente funzione per aiutare usarlo:

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

Quindi quello che stai dicendo è che non ce n'è uno standard come std :: back_inserter o std :: inserter - in breve la tua risposta è abbastanza buona e quello che sto facendo attualmente ... speravo solo che mi era sfuggito qualcosa nella stl - non mi piace srotolare la mia quando già c'è qualcosa nello stl –

+0

@sonicoder che non conosco. Conosco solo inserti anteriori, posteriori e normali oltre a quelli di ostream. Potresti dare un'occhiata a Boost ma credo che anche questi ti lasceranno desiderare per quello di cui hai bisogno. – wheaties

+0

Penso che dovrebbe essere: std :: iterator

2

L'altra alternativa (più semplice) è solo di utilizzare la struttura dati sottostante (std :: stack di solito è implementato usando std :: deque) e accetta che devi usare ad es push_back() invece di push(). Salva dover codificare il proprio iteratore e non influisce in modo particolare sulla chiarezza del codice. std :: stack non è la tua unica scelta per modellare il concetto di pila.