Я только что начал изучать bgl и попал в проблему при использовании std :: set с пользовательским упорядочением в качестве контейнера для списков ребер в список adjacency_list. Я определяю оператор < для упорядочения краев на основе их свойств, как в примере order_out_edges.cpp. Здесь boost :: edge_unique_ordering - это настраиваемый тег свойства.BGL edge (u, v, g) с пользовательским ассоциативным контейнером для списков ребер
template < typename Edge >
struct order_by_unique_order: public std::binary_function< Edge, Edge, bool >
{
inline bool operator() (const Edge& e1, const Edge& e2) const
{
return boost::get(boost::edge_unique_ordering, e1) < boost::get(boost::edge_unique_ordering, e2);
}
};
struct default_edge_containerS {};
namespace boost
{
template < class ValueType >
struct container_gen< default_edge_containerS, ValueType >
{
typedef std::set< ValueType, order_by_unique_order<ValueType> > type;
};
}
В целом работает нормально, но я получаю исключение итератора, когда я использую край (U, V, г) функцию. Если я заменил эти вызовы обходным путем, чтобы избежать запроса ребер (source, target), тогда все работает нормально.
Я просмотрел код форсирования, и я уверен, что знаю, в чем причина, я просто не уверен, что это означает, что я делаю что-то не так, это проблема с форсированным кодом или просто недокументированным несовместимость. Функция вызывает set :: find (StoredEdge (v)) в контейнере с краем списка u. Теперь по умолчанию operator_edge :: operator < просто сравнивает целевые вершины, но в моем случае вызывается мой пользовательский оператор <, и StoredEdge (v), который просматривается, явно инициализируется по умолчанию без каких-либо свойств, что, по-видимому, является причиной проблема. Мне кажется, что ребро (u, v, g) должно искать любое соответствие, основанное строго на целевой вершине, независимо от того, какое упорядочение наложено на края внутри контейнера.
Может ли кто-нибудь пролить свет на то, что я могу делать неправильно или не понимаю?
Как вы устанавливаете тип контейнера? Создал ли ваш собственный тег-генератор контейнера с помощью 'container_traits'? –
Отредактировано для отображения спецификации контейнера. Думаю, вы имели в виду container_gen? Я не встречал container_traits нигде в документации bgl. – kamrann