2

ラベル付きのグラフを作成しました。

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS,
Item, Link > UnGraph;

私のラベルはuint64_tです。グラフに自分のIDを表示したいと思います。

ノードを追加すると、すべてが正常になり、ラベルが付いたノードしかありません。

m_g.add_vertex(nodeId, Item(nodeId));

ラベルがグラフにあるかどうかを確認したい:

auto BUnGraph::exists( nid source ) const -> bool
{
    if( m_g.vertex(source) == BUnGraph::null_vertex() )
        return false;
    else
        return true;
}

しかし、方法:

vertex(source)

誤った結果が返され、ラベルに応じてnull_vertex()ではなく、ノードがグラフにない場合にデフォルトで作成されたvertex_descriptorが返されます...

私はブーストでメソッドを分離しました:

labeled_graph.hpp
    /** @name Find Labeled Vertex */
    //@{
    // Tag dispatch for sequential maps (i.e., vectors).
    template <typename Container, typename Graph, typename Label>
    typename graph_traits<Graph>::vertex_descriptor
    find_labeled_vertex(Container const& c, Graph const&, Label const& l,
                        random_access_container_tag)
    { return l < c.size() ? c[l] : graph_traits<Graph>::null_vertex(); }

内部マップを確認しました。グラフに単一のノードを追加すると、map.size()== 42になります。1ではなく!5つのノードを追加するとsize()==248。

IDに応じて、マップサイズは次のようになります。最大ラベル値* 2 + 2 したがって、map.size()よりも小さいラベル番号は誤った結果になります。

どうしたの ?

編集:グラフに60000000のようなラベルを1つのノードだけに配置しました。コンピュータのメモリが不足しました...

4

1 に答える 1

3

これを担当する行を見つけました:

/**
 * Choose the default map instance. If Label is an unsigned integral type
 * the we can use a vector to store the information.
 */
template <typename Label, typename Vertex>
struct choose_default_map {
    typedef typename mpl::if_<
        is_unsigned<Label>,
        std::vector<Vertex>,
        std::map<Label, Vertex> // TODO: Should use unordered_map?
    >::type type;
};

タイプが符号なしの場合、uint8_t、16、32、64 はベクトルを使用します。この動作の適切な使用例が見つかりません。とても危険です。

したがって、私が見つけた唯一の解決策は、今後は uint64_t の代わりにint64_tを使用することです。

于 2012-12-07T15:10:46.563 に答える