C ++ библиотека графов KOALA - понимание синтаксиса для доступа к структуре данных - PullRequest
1 голос
/ 19 марта 2019

Я использую библиотеку графов C ++ KOALA для вычисления минимального сечения графа.

Это пример, который я использую - пример . Он просто создает график с мощностями по краям и вычисляет минимальный срез.

Мой вопрос связан с этой строкой:

Flow::minEdgeCut(g, cap, s, t, Flow::outCut(blackHole, edgeIter()));

Вот документ для аргументов функции .

Он говорит, что возвращает ребра, через которые проходит минимальный разрез. Он печатает края немедленно с помощью std::cout, но мне нужно получить к ним доступ позже в программе. Мой вопрос заключается в том, как получить доступ к структуре данных, в которой они хранятся, например, чтобы распечатать их на более позднем этапе.

Пример передает stuct edgeIter в качестве аргумента outCut. edgeIter предоставляет 3 оператора перегрузки. Нужно ли добавить еще одного члена к этой статье?

struct edgeIter {
    void operator=(MyGraph::PEdge e) { cout << e->info; }
    void operator++() { }
    edgeIter &operator*() { return *this; }
};

Вот также определение метода outcut.

/** \brief Auxiliary class to represent the edge cut. (output structure) */
    template< class VIter, class EIter > struct OutCut
    {
        VIter vertIter;/**<\brief Insert iterator  to the container with vertexes (accessible from starting vertex after the cut)*/
        EIter edgeIter;/**<\brief Insert iterator to the container with edges of the cat.*/
        /**\brief Constructor*/
        OutCut( VIter av, EIter ei ): vertIter( av ), edgeIter( ei ) { }
    };

/**\brief Generating function for the OutCut object.
 *
 *  \tparam VIter the type of insert iterator to container with vertices.
 *  \tparam EIter the type of insert iterator to container with edges.
 *  \param av the insert iterator to container with vertices.
 *  \tparam ei the insert iterator to container with edges.
 *
 *  [See example](examples/flow/example_Flow.html). */
template< class VIter, class EIter > static OutCut< VIter,EIter > outCut( VIter av, EIter ei )
    { return OutCut< VIter,EIter >( av,ei ); }

1 Ответ

2 голосов
/ 19 марта 2019

edgeIter является экземпляром OutputIterator. Вы можете адаптировать код для использования std::back_inserter и собрать все результаты в вектор edges следующим образом:

std::vector<MyGraph::PEdge> edges;
Flow::minEdgeCut(g, cap, s, t, Flow::outCut(blackHole, std::back_inserter(edges)));

Существует также front_inserter, или вы можете написать пользовательскую реализацию, например edgeIter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...