2010-02-11 18 views
30

द्वारा बूस्ट बीजीएल वर्टेक्स को खोजें I vertex संदर्भ के बजाय कुंजी का उपयोग करके वर्टेक्स गुणों तक पहुंचने का एक तरीका ढूंढ रहा हूं। उदाहरण के लिए, अगर मैंएक कुंजी

class Data 
{ 
    public: 
    std::string name; 
    unsigned int value; 
}; 
typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data > Graph; 
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex; 
बजाय

Vertex vertex1 = boost::add_vertex(g); 
g[vertex1].name = "Alpha"; 
g[vertex1].value = 10; 

का उपयोग करने का

है मैं

g["Alpha"].name = "Alpha"; 
g["Alpha"].value = 10; 

तंत्र मौजूद उपयोग करने के लिए एक तैयार करता है चाहते हैं?

उत्तर

31

मुझे लगता है कि मुझे ऐसी तंत्र मिली है। इसे लेबलड_ग्राफ कहा जाता है और यह बीजीएल का हिस्सा है। इसके बजाय adjacency_list का उपयोग करने का, एक एक पूर्वनिर्धारित आवरण labeled_graph उपयोग कर सकते हैं:

typedef boost::labeled_graph< 
    boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data >, 
    std::string 
> Graph; 

इस तरह एक ग्राफ को परिभाषित करने के बाद, यह निम्नलिखित तरीके से कोने तक पहुँचने के लिए संभव है:

Graph g; 

boost::add_vertex("Alpha", g); 
g["Alpha"].name = "Alpha"; 
g["Alpha"].value = 10; 

boost::add_vertex("Beta", g); 
g["Beta"].name = "Beta"; 
g["Beta"].value = 20; 

boost::add_edge_by_label("Alpha", "Beta", g); 

इसका दुष्प्रभाव यह है कि कुछ एल्गोरिदम काम करने के लिए ग्राफ़() सदस्य फ़ंक्शन का उपयोग करने की आवश्यकता है:

std::vector<Graph::vertex_descriptor> container; 
boost::topological_sort(g.graph(), std::back_inserter(container)) ; 

किसी कारण से, लेबल किए गए_ग्राफ बीजीएल दस्तावेज़ में वर्णित नहीं है, लेकिन यह उदाहरण फ़ोल्डर में दिखाई देता है।

उत्तर के लिए धन्यवाद, सर्ज

+0

labeled_graph.hpp एडाप्टर के इतिहास को देखते हुए, ऐसा लगता है कि फ़ाइल अपेक्षाकृत नया है। (बूस्ट लाइब्रेरी रिलीज 1.40 में दिखाई देने के लिए शुरू किया गया)। शायद यही कारण है कि यह अभी तक प्रलेखन का हिस्सा नहीं है, –

1

तंत्र का उपयोग करने के मौजूद नहीं है के बाद से adjacency_list अवधारणा नहीं पता कर सकते एक तैयार है कि आप एक struct के एक खेत से अपने शिखर संपत्ति का उपयोग करना चाहते हैं।

मैं एक अतिरिक्त मानचित्र रखने का तरीका पसंद करूंगा जो डेटा के नाम को इसी कशेरुक में मानचित्रित करता है। इसके अलावा, आप कक्षा या फ़ंक्शन में अपने एल्गोरिदम को समाहित कर सकते हैं, ताकि जब कोई नया वर्टेक्स जोड़ते समय नक्शा स्वचालित रूप से भर जाता है।

संबंधित मुद्दे