2012-04-11 4 views
1

Wir benötigen einen Container, der seine Elemente nach der Priorität des Elements sortiert, wenn ein neues Element angehängt wird, das die Fähigkeit hat, ein Element mit seiner ID abzurufen.sortierter Container, der keine Prioritätswarteschlange ist

(das Problem mit Prioritätswarteschlange ist, dass es nicht Sie die Möglichkeit, ein Element abzurufen nach ID und nicht die Priorität nicht geben)

dank

+1

* Alle * Behälter geben Ihnen die Möglichkeit, ein Element nach beliebigen Kriterien abrufen. Hast du etwas vergessen? – Jon

+0

Welche Komplexität benötigen Sie? – kennytm

+1

Erstellen eines eigenen Containers, der zwei weitere Container umschließt, die die gewünschten Operationen effizient ermöglichen. –

Antwort

7

boost multi index containers geben Ihnen die Möglichkeit, eine sortierte Ansicht haben auf Priorität und eine sortierte Sicht auf ID.

Ein kleines Beispiel:

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/ordered_index.hpp> 
#include <boost/multi_index/member.hpp> 
#include <iostream> 
#include <vector> 
#include <cstddef> 
#include <iterator> 

struct elem { 
    std::size_t id; 
    int priority; 
}; 

int main() 
{ 
    using namespace boost::multi_index; 

    typedef multi_index_container< 
    elem, 
    indexed_by< 
    ordered_unique<member<elem,std::size_t,&elem::id> >, 
    ordered_non_unique<member<elem,int,&elem::priority> > 
    > 
    > elem_container; 


    // just for show 
    std::vector<elem> elems = 
    {{0, 25}, 
    {1, 10}, 
    {2, 100}, 
    {3, 6} 
    }; 
    elem_container elemc(begin(elems), end(elems)); 
    // by id 
    std::cout << "By ID: " << std::endl; 
    for(auto& x : elemc.get<0>()) { 
    std::cout << "id: " << x.id << "priority: " << x.priority << std::endl; 
    } 

    // by priority 
    std::cout << "By Priority: " << std::endl; 
    for(auto& x : elemc.get<1>()) { 
    std::cout << "id: " << x.id << "priority: " << x.priority << std::endl; 
    } 
    return 0; 
} 
+0

wir dürfen nicht boost verwenden :( – kakush

+0

@ kakush Und das gerade, als ich fertig war, ein Beispiel zu tippen, um Ihnen zu zeigen, wie einfach es ist. – pmr

+0

danke euch :) – kakush

Verwandte Themen