2015-10-14 47 views
1

我想知道是否有一種方法來獲得升壓圖邊的排序向量,而不使用lambda函數。C++ - BGL:排序邊

I.e.我目前的排序是這樣的:

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)還是我堅持使用它們?

+1

['std :: sort'](http://en.cppreference.com/w/cpp/algorithm/sort)文檔給出了不涉及lambda的示例。 –

回答

1

可以使用運算符和函子:

// sort using a custom function object 
    class customLess{ 
     Graph &_g; 
    public: 
     customLess(Graph g) 
     { 
      _g = g; 
     } 

     bool operator()(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); 
     } 
    } ; 

    std::sort(edgs.begin(), edgs.end(), customLess(g)); 

讓你沒有寫在你的代碼中每一個排序操作同一個運營商的內容。

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

+0

謝謝,但是你的函數對象從哪裏得到''g''?因爲這就是我首先使用lambda函數的原因。我可以只在結構中存儲對圖形的引用,或者..? – User1291

+1

@ User1291是的。這就是有狀態函子的概念 – sehe

1

可替代地,使用默認排序比較: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(); 
    } 
}; 

現在

std::edge<EdgeProperties> selfsorting; 

已經排序