c++ - 用 "pure"C++11 替代方案替换 BGL 遍历顶点?

标签 c++ boost c++11 iterator boost-graph

我想用纯 C++11 等效项替换顶点或边上的 BGL 迭代。 BGL 代码(来自:http://www.boost.org/doc/libs/1_52_0/libs/graph/doc/quick_tour.html)是:

typename boost::graph_traits<Graph>::out_edge_iterator out_i, out_end;
typename boost::graph_traits<Graph>::edge_descriptor e;
for (std::tie(out_i, out_end) = out_edges(v, g);
     out_i != out_end; ++out_i)
{
  e = *out_i;
  Vertex src = source(e, g), targ = target(e, g);
  std::cout << "(" << name[get(vertex_id, src)]
            << "," << name[get(vertex_id, targ)] << ") ";
}

我尝试了这里的几个建议:Replace BOOST_FOREACH with "pure" C++11 alternative?但没有运气。

我希望能够写出类似这样的东西:

for (auto &e : out_edges(v, g))
{ ... }

或类似的东西:

for (std::tie(auto out_i, auto out_end) = out_edges(v, g);
     out_i != out_end; ++out_i)
{...}

这可能吗?

最佳答案

out_edges 的简单包装就足够了:

#include <boost/range/iterator_range.hpp>
#include <type_traits>

template<class T> using Invoke = typename T::type
template<class T> using RemoveRef = Invoke<std::remove_reference<T>>;
template<class G> using OutEdgeIterator = typename boost::graph_traits<G>::out_edge_iterator;

template<class V, class G>
auto out_edges_range(V&& v, G&& g)
  -> boost::iterator_range<OutEdgeIterator<RemoveRef<G>>>
{
  auto edge_pair = out_edges(std::forward<V>(v), std::forward<G>(g));
  return boost::make_iterator_range(edge_pair.first, edge_pair.second);
}

或者更简单,一个将 std::pair 转换为有效范围的函数:

template<class It>
boost::iterator_range<It> pair_range(std::pair<It, It> const& p){
  return boost::make_iterator_range(p.first, p.second);
}

然后

for(auto e : pair_range(out_edges(v, g))){
  // ...
}

关于c++ - 用 "pure"C++11 替代方案替换 BGL 遍历顶点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13453350/

相关文章:

c++ - 有没有办法将一个对象注入(inject)另一个对象的结构?

c++ - 如何编写将二进制数转换为十进制数的递归函数?

c++ - 从boost库源码学习c++

c++ - 复制 boost::function 是否也复制闭包?

linux - 阻塞套接字和非阻塞套接字有什么区别? (对于 realz 版)

c++ - 有条件地启用替代赋值运算符

c++ - 为什么在 C++ 中将较大函数中的某些功能编写为 lambda?

C++ 字符串比较

c++ - 如何初始化未知大小的多维 vector ,C++

c++ - 在父函数中调用覆盖的子函数