簡體   English   中英

boost :: property_map是如何在boost中實現的,以及如何更改它

[英]how is boost::property_map implemented in boost and how to change it

我想知道如何在boost圖中實現屬性映射。 例如,

我有像這樣定義的頂點和邊緣屬性:

 //vertex property:-->
 struct NodeInfo {  int a , b , c; };   //actual bundled property

 struct NodeInfoPropertyTag {               // tag and kind  (as in boost documentation)
      typedef boost::vertex_property_tag kind;
      static  std::size_t const num;
 };

 std::size_t const NodeInfoPropertyTag::num = (std::size_t) &NodeInfoPropertyTag::num;

 //typedef the Vertex Property
 typedef boost::property <NodeInfoPropertyTag, NodeInfo>  NodeProperty;


 //Similar fashion for Edge Property --> some property for each edge of graph.
 typedef boost::property <EdgeInfoPropertyTag, EdgeInfo>  EdgeProperty;

我的圖表是typedef,如下所示:

 typedef boost::adjacency_list <vecS, vecS, undirectedS, NodeProperty, EdgeProperty, no_property, listS>   Graph_t;

現在,在使用上面的typedef初始化圖形G時,我可以使用屬性為頂點和邊指定屬性

例如:

  Graph_t  G;
  typedef graph_traits<Graph_t>::vertex_descriptor   vd_t;
  // edge_descriptor   ed_t;

  NodeInfo   ninfo1, ninfo2;   //put some values in ninfo  
  vd_t  v = add_vertex (ninfo1, G)   //add a vertex in G with property ninfo1 
  vd_t  u = add_vertex (ninfo2, G)   //add a vertex in G with property ninfo2


  EdgeInfo  einfo;   //initialize edgeinfo  for edge property
  add_edge (u, v, einfo, G )   edge (u, v) with property einfo is added in G

要訪問任何頂點的節點屬性,我可以使用以下兩種方法中的任何一種:

 //method 1: direct method: using Tags

 // for a vertex "v" -->  get()
 NodInfo   info  =  boost::get (NodeInfoPropertyTag(), G, v)   //get v's property

 //modify  info  

 //put the modified property
  put (NodeInfoPropertyTag(), G, v, info)    // (put in G, key = v, value = info )


 //method 2 : using property maps.

 //Edge Map and Node Map  
 typedef typename boost::property_map <Graph_t, EdgeInfoPropertyTag>::type  EdgeMap;
 typedef typename boost::property_map <Graph_t, NodeInfoPropertyTag>::type  NodeMap;


 //edge e --> get
 EdgeInfo  einfo = boost::get (EdgeMap, e)

 //modify einfo

 //put 
 put (EdgeMap, e, einfo)   //put in the EdgeMap  key = e, value = einfo

現在,兩個操作基本相同:即使用

  //former is translated to the latter --> 
  get(NodeInfoPropertyTag(), G, "key")   is equivalent to  get (NodeMap, "key")

我的問題是:

  1. 這些屬性如何存儲在Graph對象中。
  2. 它存儲在std :: map <>等地圖中嗎? 還是一些清單? 或者一些有效的類似地圖的數據結構。
  3. 如果是這樣,我如何將底層數據結構修改為std :: unordered_map甚至concurrent_hashmap或boost :: vector_property_map?

注意:我不確定我是否可以使用vector_prop_map(這里)但我真的想使用它,以便頂點id成為矢量索引並且更有效 - >它可能會導致邊緣問題

我的圖形將包含一百萬個頂點和許多邊緣,這樣在std :: map <>中搜索仍然是log(n),但我希望可移植性更改底層數據結構,以便我可以使用unordered_map / concurrent_hashmap

我需要concurrent_hashmap(來自英特爾TBB),因為我將並行化我的算法,因此希望並行訪問屬性映射,該屬性映射將由線程修改。

請建議是否可以在boost圖中控制和修改這些底層數據結構,以存儲邊緣和頂點屬性。

這些屬性如何存儲在Graph對象中。

屬性不是單獨存儲的,也不是類似的存儲。

頂點和邊緣屬性存儲在圖形的頂點和邊緣內。 沒有使用std::map或其他一些關聯容器。 無論您向adjacency_list提供什么,因為VertexProperties和EdgeProperties模板參數將存儲在頂點和邊緣中,即,它與使用std::list<T>時相同,其中T將存儲在鏈接的節點中-list(以及必要的next-prev指針)。 換句話說,adjacency_list將存儲包含VertexProperties類型的對象的頂點,以及所需的任何邊緣列表(in和out)。

當你使用property_map (通過get / put函數)時,它只是做了一些模板元編程魔術來創建一個瘦包裝器,它只會讀取/寫入頂點或邊緣的正確單獨屬性。 從概念上講,這是等價的:

NodeInfo info = boost::get (NodeInfoPropertyTag(), G, v);

// is conceptual equivalent to:

NodeInfo info = G[v].NodeInfoProperty;

這是屬性映射的全部內容,它查找頂點屬性(通過給定圖形對象中的頂點描述符),並且它獲取與給定對應的頂點屬性的數據成員(或子對象)標簽類型。 弄清楚如何為正確的屬性標記獲取正確的數據成員(或子對象)是一個模板元編程魔術,它在編譯時計算出來(沒有運行時開銷)。 並且,通常,從頂點描述符查找頂點屬性是恆定時間操作(例如,取消引用指針,通過索引查找等)。

總的來說,為特定頂點提取(讀取或寫入)特定屬性是一個恆定時間操作。 對於您使用adjacency_list的模板參數做出的任何選擇都是如此,據我所知。

如果是這樣,我如何將底層數據結構修改為std :: unordered_map甚至concurrent_hashmap或boost :: vector_property_map?

您可以通過OutEdgeList,VertexList和EdgeList指定希望如何存儲頂點和邊。 屬性本身沒有其他存儲方法。 在這些環境中使用地圖或哈希圖並沒有多大意義。

我真的想使用它,以便頂點id成為矢量索引

當您為VertexList參數指定vecS時,adjacency_list就是這種情況。

我需要concurrent_hashmap(來自英特爾TBB),因為我將並行化我的算法,因此希望並行訪問屬性映射,該屬性映射將由線程修改。

您應該考慮使用Parallel Graph庫。

請建議是否可以在boost圖中控制和修改這些底層數據結構,以存儲邊緣和頂點屬性。

您可以指定用於存儲頂點和邊列表的數據結構。 您也可以(理論上)為這些容器添加新類型的容器。 但是,根據我的經驗,這真的很難,因為adjacency_list的實現非常難以理解,並且交換其底層容器並不像Boost網站上宣傳的那么容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM