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