13 #include <boost/iterator/transform_iterator.hpp> 
   25 struct get_first : 
public std::unary_function<T, typename T::first_type> {
 
   27     typename T::first_type 
operator() (
const T& p)
 const  { 
return p.first; }
 
   37 struct get_second : 
public std::unary_function<T, typename T::second_type> {
 
   39     typename T::second_type 
operator() (
const T& p)
 const { 
return p.second; }
 
   51 template<
typename vertex_t, 
typename edge_t>
 
   60     bool are_adj (
const vertex_t&, 
const vertex_t&) 
const;
 
   63     void add_edge (
const vertex_t& u, 
const vertex_t& v, 
const edge_t& a);
 
   66     void remove_edge (
const vertex_t& u, 
const vertex_t& v);
 
   68     int indeg (
const vertex_t& v) 
const;
 
   69     int outdeg (
const vertex_t& v) 
const;
 
   76     typedef std::map<vertex_t, edge_t> alist_t;
 
   77     typedef std::map<vertex_t, alist_t> alists_t;
 
   88     typedef boost::transform_iterator<get_first<std::pair<vertex_t, alist_t>>,
 
   89                                       typename std::map<vertex_t, alist_t>::const_iterator>
 
   92     typedef boost::transform_iterator<get_first<std::pair<vertex_t, edge_t>>,
 
   93                                       typename std::map<vertex_t, edge_t>::const_iterator>
 
   95     typedef boost::transform_iterator<get_second<std::pair<vertex_t, edge_t>>,
 
   96                                       typename std::map<vertex_t, edge_t>::const_iterator>
 
   99     class const_eiterator;
 
  103         return boost::make_transform_iterator(alists.cbegin(), get_vertex);
 
  106         return boost::make_transform_iterator(alists.cend(), get_vertex);
 
  108     const_eiterator 
ebegin() const noexcept {
 
  109         return const_eiterator(*
this);
 
  111     const_eiterator 
eend() const noexcept {       
 
  112         const_eiterator it(*
this);
 
  113         it.vit = alists.end();
 
  117         typename alists_t::const_iterator it;
 
  118         if((it = alists.find(u)) == alists.end())
 
  119             throw std::out_of_range(
"The vertex doesn't exist");
 
  120         return boost::make_transform_iterator((it->second).cbegin(), get_avertex);
 
  124         typename alists_t::const_iterator it;
 
  125         if((it = alists.find(u)) == alists.end())
 
  126             throw std::out_of_range(
"The vertex doesn't exist");
 
  127         return boost::make_transform_iterator((it->second).cend(), get_avertex);
 
  131         typename alists_t::const_iterator it;
 
  132         if((it = alists.find(u)) == alists.end())
 
  133             throw std::out_of_range(
"The vertex doesn't exist");
 
  134         return boost::make_transform_iterator((it->second).cbegin(), get_aedge);
 
  138         typename alists_t::const_iterator it;
 
  139         if((it = alists.find(u)) == alists.end())
 
  140             throw std::out_of_range(
"The vertex doesn't exist");
 
  141         return boost::make_transform_iterator((it->second).cend(), get_aedge);
 
  146     std::map<vertex_t, alist_t>   alists;
 
  151 template<
typename vertex_t, 
typename edge_t>
 
  158     if(alists.find(v) == alists.end())
 
  159         alists[v] = alist_t();
 
  162 template<
typename vertex_t, 
typename edge_t>
 
  178 template<
typename vertex_t, 
typename edge_t>
 
  191 template<
typename vertex_t, 
typename edge_t>
 
  201     for(
auto& entry : alists) {
 
  202         entry.second.erase(v);
 
  206 template<
typename vertex_t, 
typename edge_t>
 
  216 template<
typename vertex_t, 
typename edge_t>
 
  225     for(
auto& entry : alists) {
 
  226         auto& alist = entry.second;
 
  227         if(alist.find(v) != alist.end())
 
  233 template<
typename vertex_t, 
typename edge_t>
 
  239     return alists.at(v).size();
 
  242 template<
typename vertex_t, 
typename edge_t>
 
  248     return alists.size();
 
  251 template<
typename vertex_t, 
typename edge_t>
 
  259     for(
auto& entry : alists)
 
  260         sum += entry.second.size();
 
  265 template<
typename vertex_t, 
typename edge_t>
 
  267                                                 const vertex_t& v)
 const {
 
  274     return alists.at(u).find(v) != alists.at(u).end();
 
  277 template<
typename vertex_t, 
typename edge_t>
 
  281     typename alist_t::const_iterator  ait;
 
  282     typename alists_t::const_iterator vit;
 
  289     template<
typename t1, 
typename t2>
 
  290     friend std::ostream& 
operator<<(std::ostream& out,
 
  299         if(G.alists.size() != 0) {
 
  300             vit = G.alists.cbegin();
 
  301             ait = (vit->second).cbegin();
 
  313         while(vit != G.alists.cend() and ait == (vit->second).cend()) {
 
  315             ait = (vit->second).cbegin();
 
  322         if(ait == (vit->second).cbegin()) {
 
  323             while(vit != G.alists.cbegin() and (vit->second).cbegin() == (vit->second).cend())
 
  325             ait = --((vit->second).cend());
 
  350         return (vit == other.vit && ait == other.ait) || 
 
  351                (vit == other.vit && vit == G.alists.end());
 
  355         return !(*
this == other);
 
  361 template<
typename vertex_t, 
typename edge_t>
 
  364         out << *(eit.ait).second;
 
const outer::edge_type & operator++()
Definition: adj_list.h:311
 
void add_vertex(const vertex_t &v)
Definition: adj_list.h:152
 
void add_edge(const vertex_t &u, const vertex_t &v, const edge_t &a)
Definition: adj_list.h:163
 
bool operator!=(const const_eiterator &other) const 
Definition: adj_list.h:354
 
outer::edge_type operator--(int)
Definition: adj_list.h:339
 
const_aviterator avend(const vertex_t &u) const 
Definition: adj_list.h:123
 
int outdeg(const vertex_t &v) const 
Definition: adj_list.h:234
 
bool operator==(const const_eiterator &other) const 
Definition: adj_list.h:349
 
const_viterator vend() const  noexcept
Definition: adj_list.h:105
 
boost::transform_iterator< get_second< std::pair< vertex_t, edge_t > >, typename std::map< vertex_t, edge_t >::const_iterator > const_aeiterator
Definition: adj_list.h:97
 
const_eiterator ebegin() const  noexcept
Definition: adj_list.h:108
 
const_aviterator avbegin(const vertex_t &u) const 
Definition: adj_list.h:116
 
The interface of a graph model. 
Definition: graph_model.h:25
 
T::second_type operator()(const T &p) const 
Definition: adj_list.h:39
 
const outer::edge_type & operator--()
Definition: adj_list.h:321
 
boost::transform_iterator< get_first< std::pair< vertex_t, alist_t > >, typename std::map< vertex_t, alist_t >::const_iterator > const_viterator
Iterators. 
Definition: adj_list.h:90
 
Definition: adj_list.h:25
 
const_aeiterator aeend(const vertex_t &u) const 
Definition: adj_list.h:137
 
T::first_type operator()(const T &p) const 
Definition: adj_list.h:27
 
const_eiterator eend() const  noexcept
Definition: adj_list.h:111
 
void remove_edge(const vertex_t &u, const vertex_t &v)
Definition: adj_list.h:207
 
Definition: adj_list.h:278
 
int indeg(const vertex_t &v) const 
Definition: adj_list.h:217
 
friend class const_iterator
Definition: adj_list.h:99
 
boost::transform_iterator< get_first< std::pair< vertex_t, edge_t > >, typename std::map< vertex_t, edge_t >::const_iterator > const_aviterator
Definition: adj_list.h:94
 
Definition: adj_list.h:52
 
const_eiterator(const const_eiterator &eit)
Definition: adj_list.h:305
 
const_aeiterator aebegin(const vertex_t &u) const 
Definition: adj_list.h:130
 
vertex_t to
Definition: edge.h:22
 
int num_edges() const 
Definition: adj_list.h:252
 
outer::edge_type operator++(int)
Definition: adj_list.h:332
 
edge_t edge_type
Definition: adj_list.h:57
 
int num_vertices() const 
Definition: adj_list.h:243
 
void remove_vertex(const vertex_t &v)
Definition: adj_list.h:192
 
const_eiterator(const adj_list< vertex_t, edge_t > &graph)
Definition: adj_list.h:298
 
std::ostream & operator<<(std::ostream &out, typename adj_list< vertex_t, edge_t >::const_eiterator eit)
Definition: adj_list.h:362
 
Definition: adj_list.h:37
 
vertex_t from
Definition: edge.h:21
 
const_viterator vbegin() const  noexcept
Definition: adj_list.h:102
 
const edge_t & operator*()
Definition: adj_list.h:345
 
bool are_adj(const vertex_t &, const vertex_t &) const 
Returs true if the two given vertices are adjacent, otherwise false. 
Definition: adj_list.h:266
 
vertex_t vertex_type
Definition: adj_list.h:56