简体   繁体   中英

sorted container that is not a priority queue

we need a container that keeps its elements sorted by the element's priority when appending a new element, that has the ability to retrieve an element given it's id.

(the problem with priority queue is that it doesn't give you the ability to retrieve an element according to id and not priority)

thanks

boost multi index containers give you the ability to have a sorted view on priority and a sorted view on ID.

A small example:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM