boost::bimap для хранения свойств вершин графа
От: kermzyxer  
Дата: 11.11.12 21:04
Оценка:
Здравствуйте.
Вопрос к знатокам boost::bimap и, возможно, boost::graph.

коротко: как в boost::bimap хранить один из ключей как vector[от второго]?

длинно:

Необходимо привязать привязать переменную(unsigned int, уникальный идентификатор) к подмножеству вершин графа. Операции преобразования дескриптора вершины(unsigned int) в идентификатор и обратно должны работать за O(1). Для работы с графом использую библиотеку BGL.

Граф определен так: (код писал — не копировал: на возможные опечатки не обращать внимание)
typedef boost::adjacency_list<
  boost::setS, // ребра
  boost::vecS, // вершины
  boost::bidirectionalS,
  …
> Graph;
…
Graph graph;


Для привязки свойств к вершинам использую двунаправленный ассоциативный контейнер. (boost::bimap)

Стандартный вариант использования: (Graph::vertex_descriptor == unsigned int)
typedef boost::bimap<
  boost::bimaps::unordered_map_of(Graph::vertex_descriptor), // дескриптор вершины
  boost::bimaps::unordered_map_of(Graph::vertex_descriptor)  // свойство — идентификатор в подмножестве
> Prop;
…
Prop prop;


В принципе работает, но меня коробит, что я переменную, которая последовательно принимает значения от 0 до N, храню в хеш-таблице.(prop.right) Вопрос: как в boost::bimap хранить один из ключей как vector[от второго]? После тщательного рассматривания док-ии, я так понял, что никак , т.к vector — это не «key-based set»: bimap хранит в нем пары (left key, right key).

т.е.
typedef boost::bimap<
  boost::bimaps::unordered_map_of(Graph::vertex_descriptor), // дескриптор вершины
  boost::bimaps::vector_of(Graph::vertex_descriptor)         // свойство — идентификатор в подмножестве
> Prop;
…
Prop prop;

не катит: prop.right — вектор пар

ЗЫ:
Пока писал вопрос, придумал, что вообще говоря, конструкции unordered_set_of можно скормить свою хеш функцию, определенную таким образом, чтобы она возвращала сам ключ:
template
<
    class KeyType,
    class HashFunctor   = hash< KeyType >,
    class EqualKey      = std::equal_to< KeyType >
>
struct unordered_set_of;

Насколько это правильный вариант?
c++ boost boost::graph boost::bimap
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.