Итерация по диапазону и «еще один» - PullRequest
2 голосов
/ 16 августа 2011

В алгоритме, который я сейчас реализую, есть эта строка (где u - вершина графа, а Pred(u) - все вершины, ребра которых указывают на u):

for all s ∈ Pred(u) ∪ {u}

Часть Pred(u), которую я перевожу в код boost :: graph, вот так:

boost::graph_traits<Graph>::in_edge_iterator in_begin, in_end;
boost::tie(in_begin, in_end) = boost::in_edges(u, G);
for(boost::graph_traits<Graph>::in_edge_iterator i = in_begin; i != in_end; ++i) {
    // Do stuff
}

Пока что я делаю Do stuff вне цикла явно для u,но я бы хотел сделать это в цикле for.Есть ли хитрость для создания итераторов, как если бы boost::in_edges был возвращен из *1015*?

1 Ответ

3 голосов
/ 16 августа 2011

Я думаю, что решение, которое вы используете, в порядке (при условии, что код Do stuff хорошо разложен).

Однако, если вы часто сталкиваетесь с такими проблемами, вы можете взглянуть на Boost.Range , библиотеку для манипулирования диапазонами значений вместо итераторов. Здесь вы можете использовать функцию соединения , чтобы получить объединение двух диапазонов (результат boost::in_edges и u).

...