2010-11-06 3 views
8

vector, list, deque ont std :: back_inserter et set a std :: inserter.Inserters pour STL stack et priority_queue

Pour la pile et priority_queue, je suppose que l'inséreuse équivélente serait un push() mais je n'arrive pas à trouver la fonction correcte à appeler.

Mon intention est de pouvoir utiliser la fonction suivante avec le iterator insert correct:

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

Répondre

4

Vous pouvez toujours passer votre chemin et mettre en œuvre un itérateur vous. Je n'ai pas vérifié ce code mais cela devrait fonctionner. Accent sur "Je n'ai pas vérifié."

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

Je voudrais aussi ajouter dans la fonction suivante pour aider à l'utiliser:

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

Donc, ce que vous dites, c'est qu'il n'y en a pas un standard comme std :: back_inserter ou std :: inserter - en bref, votre réponse est plutôt bonne et ce que je fais actuellement ... j'espère juste que J'avais manqué quelque chose dans la stl - n'aime pas déployer mon propre quand il ya déjà quelque chose dans la stl –

+0

@sonicoder pas que je sache. Je ne connais que des inserters avant, arrière et réguliers en plus de ceux d'ostream. Vous pourriez regarder Boost mais je crois que même ceux-ci vous laisseront vouloir ce dont vous avez besoin. – wheaties

+0

Je pense qu'il devrait être: std :: itérateur

2

L'autre alternative (simple) est juste à utiliser la structure de données sous-jacentes (std :: pile est généralement mis en œuvre en utilisant std :: deque) et acceptez que vous devez utiliser par exemple push_back() au lieu de push(). Enregistre d'avoir à coder votre propre itérateur, et n'affecte pas particulièrement la clarté du code. std :: stack n'est pas votre seul choix pour modéliser le concept de pile.