2010-02-11 32 views
30

Tôi đang tìm cách truy cập các thuộc tính đỉnh bằng cách sử dụng một phím thay vì tham chiếu đỉnh. Ví dụ, nếu tôi cóTìm tăng cường đỉnh BGL bằng một phím

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; 

thay vì sử dụng

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

Tôi muốn có

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

Có một sẵn sàng sử dụng cơ chế tồn tại?

Trả lời

31

Tôi nghĩ rằng tôi đã tìm thấy cơ chế như vậy. Nó được gọi là label_graph và là một phần của BGL. Thay vì sử dụng adjacency_list, người ta có thể sử dụng một định nghĩa trước wrapper labeled_graph:

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

Sau khi xác định một đồ thị như thế này, chúng ta có thể truy cập vào các đỉnh theo cách sau đây:

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); 

Tác dụng phụ của việc này là cần phải sử dụng hàm thành viên graph() để làm cho một số thuật toán hoạt động:

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

Vì một lý do nào đó, label_graph không được mô tả trong tài liệu BGL, nhưng nó xuất hiện trong thư mục mẫu.

Cảm ơn bạn đã trả lời, Serge

+0

Nhìn vào lịch sử của bộ chuyển đổi labeled_graph.hpp, nó trông giống như các tập tin là tương đối mới. (Bắt đầu xuất hiện trong thư viện Boost release 1.40). Có lẽ đó là lý do tại sao nó không phải là một phần của tài liệu, –

1

Cơ chế sẵn sàng sử dụng không tồn tại vì khái niệm adjacency_list không thể biết mà bạn muốn truy cập thuộc tính đỉnh của mình theo trường trong cấu trúc.

Tôi thích cách có bản đồ bổ sung ánh xạ tên dữ liệu đến đỉnh tương ứng. Hơn nữa, bạn có thể đóng gói thuật toán của bạn trong một lớp hoặc một hàm, để khi thêm một đỉnh mới bản đồ được điền tự động.

Các vấn đề liên quan