您可以编写自己的 EdgeList 或 OutEdgeList 类来自动对元素进行排序。我举了一个例子,因为恕我直言如何做到这一点并不那么明显。
#include <iostream>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_list.hpp>
using namespace boost;
template<class T> struct Sorted_list
{
std::list<T> v;
public:
typedef T value_type;
typedef typename std::list<T>::size_type size_type;
typedef typename std::list<T>::iterator iterator;
iterator insert(const T& x)
{
Sorted_list<T>::iterator i = v.begin();
while(i != v.end() && x > *i)
{
i++;
}
return v.insert(i, x);
}
iterator begin() { return v.begin(); }
iterator end() { return v.end(); }
size_type size() const { return v.size(); }
};
struct SlistS {};
namespace boost {
template <class ValueType> struct container_gen<SlistS, ValueType>
{
typedef Sorted_list<ValueType> type;
};
struct sorted_list_tag {};
template<class T> sorted_list_tag container_category(Sorted_list<T>&)
{
return sorted_list_tag();
}
template<class T> std::pair<typename Sorted_list<T>::iterator, bool>
push_dispatch(Sorted_list<T>& v, const T& x, sorted_list_tag)
{
return std::make_pair(v.insert(x), true);
}
template <> struct parallel_edge_traits<SlistS> {
typedef allow_parallel_edge_tag type;
};
}
int main()
{
typedef adjacency_list<SlistS> Graph;
Graph g(10);
add_edge(1, 2, g);
add_edge(1, 5, g);
add_edge(1, 3, g);
add_edge(1, 7, g);
add_edge(1, 1, g);
graph_traits<Graph>::edge_iterator i, end;
for (tie(i, end) = edges(g); i != end; ++i) {
std::cout << source(*i, g) << " -> " << target(*i, g) << std::endl;
}
return 0;
}
输出:
1 -> 1
1 -> 2
1 -> 3
1 -> 5
1 -> 7