2010-11-06 23 views
8

vektörleri, listesi, deque std :: back_inserter ve set std :: inserter.STL yığıtı ve priority_queue

Yığın ve priority_queue için, eşdeğer ekleyicinin bir itme() olacağını varsayabilirim ancak doğru işlevi göremiyorum.

Benim niyet doğru insert Yineleyici ile aşağıdaki işlevi kullanabilmek için olmaktır:

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

cevap

4

Hep kendi yoluna git ve bir yineleyici kendiniz uygulayabilir. Bu kodu doğrulamadım ama işe yaramalı. "Doğrulamadım" konusuna vurgu yapın.

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; } 
}; 
şunlarla işlevinde eklersiniz

kullanmak yardımcı olmak için: sadece temel veri yapısını kullanmaktır

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

Yani dedikleriniz std :: back_inserter veya std :: inserter gibi standart bir tane yok - kısacık cevabınız gayet iyi ve şu anda yaptığım şey ... stl içinde bir şey özledim - zaten zaten bir şey olduğunu bilmiyorum değil stl –

+0

@sonicoder değil kendi yuvarlanmayı seviyorum. Ben sadece ön, arka ve sıradan inserserleri biliyorum. Boost'a bakabilirsin ama inanıyorum ki, ihtiyacın olanı istediğin için seni bırakacak. – wheaties

+0

Bence şöyle olmalı: std :: iterator

2

diğer alternatif (daha basit) (std :: yığın genellikle uygulanmaktadır std :: deque kullanarak) ve kullanmak zorunda olduğunuzu kabul edin push() yerine push_back(). Kendi yineleyicinizi kodlamaktan sorumludur ve özellikle kodun netliğini etkilemez. std :: stack, yığın konseptini modellemek için tek seçeneğiniz değil.