Ticket #386: 386-out-iterator-d3dcc49e6403.patch
File 386-out-iterator-d3dcc49e6403.patch, 9.5 KB (added by , 12 years ago) |
---|
-
lemon/christofides_tsp.h
# HG changeset patch # User Peter Kovacs <kpeter@inf.elte.hu> # Date 1362067994 -3600 # Node ID d3dcc49e64033041370e77c0c7488499bbf7241f # Parent dff32ce3db712f2d6e262e75fae4d9404798afa8 Use output iterator instead of a container (#386) in tourNodes() functions of TSP algorithms diff --git a/lemon/christofides_tsp.h b/lemon/christofides_tsp.h
a b 209 209 /// \brief Gives back the node sequence of the found tour. 210 210 /// 211 211 /// This function copies the node sequence of the found tour into 212 /// the given standard container. 212 /// an STL container through the given output iterator. The 213 /// <tt>value_type</tt> of the container must be <tt>FullGraph::Node</tt>. 214 /// For example, 215 /// \code 216 /// std::vector<FullGraph::Node> nodes(countNodes(graph)); 217 /// tsp.tourNodes(nodes.begin()); 218 /// \endcode 219 /// or 220 /// \code 221 /// std::list<FullGraph::Node> nodes; 222 /// tsp.tourNodes(std::back_inserter(nodes)); 223 /// \endcode 213 224 /// 214 225 /// \pre run() must be called before using this function. 215 template <typename Container>216 void tourNodes( Container &container) const {217 container.assign(_path.begin(), _path.end());226 template <typename Iterator> 227 void tourNodes(Iterator out) const { 228 std::copy(_path.begin(), _path.end(), out); 218 229 } 219 230 220 231 /// \brief Gives back the found tour as a path. -
lemon/greedy_tsp.h
diff --git a/lemon/greedy_tsp.h b/lemon/greedy_tsp.h
a b 206 206 /// \brief Gives back the node sequence of the found tour. 207 207 /// 208 208 /// This function copies the node sequence of the found tour into 209 /// the given standard container. 209 /// an STL container through the given output iterator. The 210 /// <tt>value_type</tt> of the container must be <tt>FullGraph::Node</tt>. 211 /// For example, 212 /// \code 213 /// std::vector<FullGraph::Node> nodes(countNodes(graph)); 214 /// tsp.tourNodes(nodes.begin()); 215 /// \endcode 216 /// or 217 /// \code 218 /// std::list<FullGraph::Node> nodes; 219 /// tsp.tourNodes(std::back_inserter(nodes)); 220 /// \endcode 210 221 /// 211 222 /// \pre run() must be called before using this function. 212 template <typename Container>213 void tourNodes( Container &container) const {214 container.assign(_path.begin(), _path.end());223 template <typename Iterator> 224 void tourNodes(Iterator out) const { 225 std::copy(_path.begin(), _path.end(), out); 215 226 } 216 227 217 228 /// \brief Gives back the found tour as a path. -
lemon/insertion_tsp.h
diff --git a/lemon/insertion_tsp.h b/lemon/insertion_tsp.h
a b 203 203 /// \brief Gives back the node sequence of the found tour. 204 204 /// 205 205 /// This function copies the node sequence of the found tour into 206 /// the given standard container. 206 /// an STL container through the given output iterator. The 207 /// <tt>value_type</tt> of the container must be <tt>FullGraph::Node</tt>. 208 /// For example, 209 /// \code 210 /// std::vector<FullGraph::Node> nodes(countNodes(graph)); 211 /// tsp.tourNodes(nodes.begin()); 212 /// \endcode 213 /// or 214 /// \code 215 /// std::list<FullGraph::Node> nodes; 216 /// tsp.tourNodes(std::back_inserter(nodes)); 217 /// \endcode 207 218 /// 208 219 /// \pre run() must be called before using this function. 209 template <typename Container>210 void tourNodes( Container &container) const {211 container.assign(_tour.begin(), _tour.end());220 template <typename Iterator> 221 void tourNodes(Iterator out) const { 222 std::copy(_tour.begin(), _tour.end(), out); 212 223 } 213 224 214 225 /// \brief Gives back the found tour as a path. -
lemon/nearest_neighbor_tsp.h
diff --git a/lemon/nearest_neighbor_tsp.h b/lemon/nearest_neighbor_tsp.h
a b 193 193 /// \brief Gives back the node sequence of the found tour. 194 194 /// 195 195 /// This function copies the node sequence of the found tour into 196 /// the given standard container. 196 /// an STL container through the given output iterator. The 197 /// <tt>value_type</tt> of the container must be <tt>FullGraph::Node</tt>. 198 /// For example, 199 /// \code 200 /// std::vector<FullGraph::Node> nodes(countNodes(graph)); 201 /// tsp.tourNodes(nodes.begin()); 202 /// \endcode 203 /// or 204 /// \code 205 /// std::list<FullGraph::Node> nodes; 206 /// tsp.tourNodes(std::back_inserter(nodes)); 207 /// \endcode 197 208 /// 198 209 /// \pre run() must be called before using this function. 199 template <typename Container>200 void tourNodes( Container &container) const {201 container.assign(_path.begin(), _path.end());210 template <typename Iterator> 211 void tourNodes(Iterator out) const { 212 std::copy(_path.begin(), _path.end(), out); 202 213 } 203 214 204 215 /// \brief Gives back the found tour as a path. -
lemon/opt2_tsp.h
diff --git a/lemon/opt2_tsp.h b/lemon/opt2_tsp.h
a b 230 230 /// \brief Gives back the node sequence of the found tour. 231 231 /// 232 232 /// This function copies the node sequence of the found tour into 233 /// the given standard container. 233 /// an STL container through the given output iterator. The 234 /// <tt>value_type</tt> of the container must be <tt>FullGraph::Node</tt>. 235 /// For example, 236 /// \code 237 /// std::vector<FullGraph::Node> nodes(countNodes(graph)); 238 /// tsp.tourNodes(nodes.begin()); 239 /// \endcode 240 /// or 241 /// \code 242 /// std::list<FullGraph::Node> nodes; 243 /// tsp.tourNodes(std::back_inserter(nodes)); 244 /// \endcode 234 245 /// 235 246 /// \pre run() must be called before using this function. 236 template <typename Container>237 void tourNodes( Container &container) const {238 container.assign(_path.begin(), _path.end());247 template <typename Iterator> 248 void tourNodes(Iterator out) const { 249 std::copy(_path.begin(), _path.end(), out); 239 250 } 240 251 241 252 /// \brief Gives back the found tour as a path. -
test/tsp_test.cc
diff --git a/test/tsp_test.cc b/test/tsp_test.cc
a b 61 61 // } 62 62 63 63 // Checks tour validity 64 bool checkTour(const FullGraph &gr, const std::vector<FullGraph::Node> &p) { 64 template <typename Container> 65 bool checkTour(const FullGraph &gr, const Container &p) { 65 66 FullGraph::NodeMap<bool> used(gr, false); 66 67 67 int nodes = 0; 68 for (int i = 0; i < int(p.size()); ++i) { 69 if (used[p[i]]) return false; 70 used[p[i]] = true; 71 ++nodes; 68 int node_cnt = 0; 69 for (typename Container::const_iterator it = p.begin(); it != p.end(); ++it) { 70 FullGraph::Node node = *it; 71 if (used[node]) return false; 72 used[node] = true; 73 ++node_cnt; 72 74 } 73 75 74 return (node s== gr.nodeNum());76 return (node_cnt == gr.nodeNum()); 75 77 } 76 78 77 79 // Checks tour validity 78 bool checkTour (const FullGraph &gr, const Path<FullGraph> &p) {80 bool checkTourPath(const FullGraph &gr, const Path<FullGraph> &p) { 79 81 FullGraph::NodeMap<bool> used(gr, false); 80 82 81 83 if (!checkPath(gr, p)) return false; … … 134 136 check(alg.run() == esize, alg_name + ": Wrong total cost"); 135 137 check(alg.tourCost() == esize, alg_name + ": Wrong total cost"); 136 138 137 std::list<Node> list; 138 std::vector<Node> vec; 139 alg.tourNodes(list); 140 alg.tourNodes(vec); 141 check(list.size() == nsize, alg_name + ": Wrong node sequence"); 142 check(vec.size() == nsize, alg_name + ": Wrong node sequence"); 143 check(alg.tourNodes().size() == nsize, alg_name + ": Wrong node sequence"); 144 check(checkTour(g, vec), alg_name + ": Wrong node sequence"); 145 check(checkCost(g, vec, constMap<Edge, int>(1), esize), 139 std::list<Node> list1(nsize), list2; 140 std::vector<Node> vec1(nsize), vec2; 141 alg.tourNodes(list1.begin()); 142 alg.tourNodes(vec1.begin()); 143 alg.tourNodes(std::front_inserter(list2)); 144 alg.tourNodes(std::back_inserter(vec2)); 145 check(checkTour(g, alg.tourNodes()), alg_name + ": Wrong node sequence"); 146 check(checkTour(g, list1), alg_name + ": Wrong node sequence"); 147 check(checkTour(g, vec1), alg_name + ": Wrong node sequence"); 148 check(checkTour(g, list2), alg_name + ": Wrong node sequence"); 149 check(checkTour(g, vec2), alg_name + ": Wrong node sequence"); 150 check(checkCost(g, vec1, constMap<Edge, int>(1), esize), 146 151 alg_name + ": Wrong tour cost"); 147 152 148 153 SimplePath<FullGraph> path; 149 154 alg.tour(path); 150 155 check(path.length() == esize, alg_name + ": Wrong tour"); 151 check(checkTour (g, path), alg_name + ": Wrong tour");156 check(checkTourPath(g, path), alg_name + ": Wrong tour"); 152 157 check(checkCost(g, path, constMap<Edge, int>(1), esize), 153 158 alg_name + ": Wrong tour cost"); 154 159 } … … 180 185 check(alg.run() > 0, alg_name + ": Wrong total cost"); 181 186 182 187 std::vector<Node> vec; 183 alg.tourNodes( vec);188 alg.tourNodes(std::back_inserter(vec)); 184 189 check(checkTour(g, vec), alg_name + ": Wrong node sequence"); 185 190 check(checkCost(g, vec, cost, alg.tourCost()), 186 191 alg_name + ": Wrong tour cost"); 187 192 188 193 SimplePath<FullGraph> path; 189 194 alg.tour(path); 190 check(checkTour (g, path), alg_name + ": Wrong tour");195 check(checkTourPath(g, path), alg_name + ": Wrong tour"); 191 196 check(checkCost(g, path, cost, alg.tourCost()), 192 197 alg_name + ": Wrong tour cost"); 193 198