C ++ - BGL:排序边缘

时间:2015-10-14 16:45:22

标签: c++ sorting boost graph lambda

我想知道是否有办法在不使用lambda函数的情况下获得增强图的边缘的有序向量。

即。我目前正在这样排序:

std::vector<Edge> edgs = ...;
std::sort(edgs.begin(),edgs.end(),
        [&](const Edge& e1, const Edge& e2){
            return g[e1].source < g[e2].source || (g[e1].source == g[e2].source && g[e1].target < g[e2].target);
    });

g是图表,我们从中获取了边缘和

struct EdgeProperties{
    int weight;
    int source;
    int target;
};
typedef boost::adjacency_list<vecS,vecS,undirectedS,no_property,EdgeProperties> Graph;
typedef boost::graph_traits<Graph> Traits;
typedef Traits::vertex_descriptor Vertex;
typedef Traits::edge_descriptor Edge;

有效,但我不想使用lambda函数。有没有办法避免它们(仍然使用std :: sort)还是我坚持使用它们?

2 个答案:

答案 0 :(得分:1)

您可以使用运算符和仿函数:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>


<div ng-app="myApp" ng-controller="myCtrl">
  <button type="button" ng-click="makeApiPostCall()">Make POST call</button>
  <div ng-bind="postCallResponse"></div>
</div>

这样您就不必在代码中的每个排序操作中记下相同的运算符内容。

参考: http://en.cppreference.com/w/cpp/algorithm/sortC++ Functors - and their uses

答案 1 :(得分:1)

或者,使用默认排序比较:@Html.LabelFor(model => model.EmployeeType, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EnumDropDownListFor(model => model.EmployeeType, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.EmployeeType, "", new { @class = "text-danger" }) </div>

E.g:

std::less<Edge>

现在

#include <boost/tuple/tuple_comparison.hpp>

using namespace boost;

struct EdgeProperties{
    int weight;
    int source;
    int target;

private:
    auto key() const { return tie(weight, source, target); }
public:

    bool operator<(EdgeProperties const& other) const {
        return key() < other.key();
    }
};

已经排序