2009-10-02 23 views
5

Ziyaretçinin içinden gelen vertex'in özelliklerini nasıl değiştirmeliyim?Ziyaretçiden gelen özellikleri değiştirme

Grafiğin alt komut dosyasının basit yöntemini kullanmak istiyorum, ancak ziyaretçiye geçirilen grafik parametresi const'dir, bu nedenle derleyici değişiklikleri reddeder.

Ziyaretçideki grafiğe bir başvuru kaydedebilirim, ancak bu garip görünüyor.

/** 

    A visitor which identifies vertices as leafs or trees 

*/ 
class bfs_vis_leaf_finder:public default_bfs_visitor { 

public: 
    /** 

    Constructor 

    @param[in] total reference to int variable to store total number of leaves 
    @param[in] g reference to graph (used to modify bundled properties) 

    */ 
    bfs_vis_leaf_finder(int& total, graph_t& g) : 
     myTotal(total), myGraph(g) 
     { 
      myTotal = 0; 
     } 

    /** 

    Called when the search finds a new vertex 

    If the vertex has no children, it is a leaf and the total leaf count is incremented 

    */ 
    template <typename Vertex, typename Graph> 
    void discover_vertex(Vertex u, Graph& g) 
    { 
     if(out_edges(u, g).first == out_edges(u, g).second) { 
      myTotal++; 
      //g[u].myLevel = s3d::cV::leaf; 
      myGraph[u].myLevel = s3d::cV::leaf; 
     } else { 
      //g[u].myLevel = s3d::cV::tree; 
      myGraph[u].myLevel = s3d::cV::tree; 
     } 
    } 

    int& myTotal; 
    graph_t& myGraph; 
}; 

cevap

4

Çözümünüz doğru.

Eğer ziyaretçi kurucusuna tek ilginç özellik harita geçmek ve boost::get(property, u) = s3d::cV::leaf; kullanarak elemanları erişebilir ziyaretçinin grafik türünü decouple için. Bu şekilde, her tür uyumlu vertex özelliğini ziyaretçiye iletebilirsiniz (ziyaretçi daha genel olacaktır ve grafik türündeki değişiklikleri adlandırmak için duyarlı değildir).

mülkiyet haritası için tip

ziyaretçi sınıf için şablon tip-adı olacaktır ve bir şey gibi olacak:

typedef property_map<graph_t, s3d_cv3_leaf_t your_vertex_info::*>::type your_property_map; 

paketlenmiş özellikleri hakkında tam bir tez here bakınız.

HTH

0

Sadece bu şeyleri öğreniyorum, ancak ziyaretçideki grafiğe bir başvuru kaydetmeniz gerektiği doğrudur. Bu sebepten emin değilim, ancak her bir fonksiyonun iki versiyonunu sağlamak için tüm fonksiyonların/versiyon türevlerinin iki versiyonunu sağlamak istemedikleri için olabilir. Özellikle grafik geçici çözüm kullanılabilir olduğunda.

Garip hissetse bile, grafik referansa başvurmanın "doğru yol" olabileceğini düşünüyorum.

+0

Referansa başvurmanın yolu olması gerektiğini düşünmeye başladım. Basit bir şeye baktığımı farz ettim, ama hiç kimse şimdiye kadar başka bir şey önermediği için ... – ravenspoint