Изменение свойств вершины в Повышении:: График

Вы можете использовать Array.flatMap() с Array.map() :

const arr1 = [1, 2, 3];
const arr2 = ['a', 'b', 'c'];

const getCombinations = (a, b) => 
  a.flatMap(el1 => b.map(el2 => ({ el1, el2 })));

const result = getCombinations(arr1, arr2);

console.log(result);

[118 ]

33
задан Tim 26 December 2015 в 13:31
поделиться

5 ответов

Я рассматриваю Повышение. График, чтобы иметь очень хорошую документацию, но не действительно для новичков по вопросу. Таким образом, здесь идет пример, что я надеюсь, достаточно просто!

//includes

// Create a name for your information
struct VertexInformation
{
  typedef boost::vertex_property_type type;
};

// Graph type, customize it to your needs
// This is when you decide what information will be attached to vertices and/or edges
// of MyGraph objects
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS,
  boost::property<VertexInformation, double> > MyGraph;

int main()
{
  MyGraph graph;

  // Create accessor for information
  typedef boost::property_map<MyGraph, VertexInformation>::type  InformationAccessor;
  InformationAccessor information( get( VertexInformation(), graph ) );

  // Create a vertex (for example purpose)
  typedef boost::graph_traits<MyGraph>::vertex_descriptor MyVertex;
  MyVertex vertex = add_vertex( graph );

  // Now you can access your information
  put( information, vertex, 1. );

  // returns 1 !
  get( information, vertex );
  return 0;
}
1
ответ дан 27 November 2019 в 17:40
поделиться

Это полностью зависит от базы данных. Существует два основных варианта: 1 - СУБД, которые позволяют использовать ключевое слово автоинкремента рядом с определением первичного ключа, и 2 - СУБД, которые предоставляют генераторы последовательностей (которые затем можно использовать для генерации новых значений для ПК, например, написав триггер «перед вставкой», который автоматически вставляет новое значение в столбец перед завершением вставки).

Насколько мне известно:

  1. Firebird использует последовательности
  2. DB2 позволяет определять столбец как «GENERATED BY» и graph_notes_t - мои собственные свойства и, следовательно, нуждаются в определении. Я собрал этот код из различных примеров и документации, и я не совсем уверен, что делает BOOST_INSTALL_PROPERTY , но код, похоже, работает нормально.

    // Define custom properties
    enum vertex_location_t { vertex_location };
    enum edge_length_t     { edge_length     };
    enum graph_notes_t     { graph_notes     };
    
    namespace boost
    {
        BOOST_INSTALL_PROPERTY(vertex, location);
        BOOST_INSTALL_PROPERTY(edge,   length  );
        BOOST_INSTALL_PROPERTY(graph,  notes   );
    }
    
    // Define vertex properties:  vertex name and location
    typedef property<vertex_name_t,     string,
            property<vertex_location_t, Point3> >
    VertexProperties;
    
    // Define edge properties:  length
    typedef property<edge_length_t, double> EdgeProperties;
    
    // Define graph properties:  graph name and notes
    typedef property<graph_name_t,  string,
            property<graph_notes_t, string> >
    GraphProperties;
    
    // Define a graph type
    typedef adjacency_list
    <
        vecS,       // edge container type
        vecS,       // vertex container type
        undirectedS,
        VertexProperties,
        EdgeProperties,
        GraphProperties
    > Graph;
    
4
ответ дан 27 November 2019 в 17:40
поделиться

Я не Мне не нравится подход свойства вложенного шаблона в boost :: graph, поэтому я написал небольшую оболочку для всего, что в основном позволяет помещать любую структуру / класс как свойство вершины / края. Можно получить доступ к свойствам, обращаясь к членам структуры.

Чтобы сохранить гибкость, эти структуры определены как параметр шаблона.

Здесь Код:

/* definition of basic boost::graph properties */
enum vertex_properties_t { vertex_properties };
enum edge_properties_t { edge_properties };
namespace boost {
    BOOST_INSTALL_PROPERTY(vertex, properties);
    BOOST_INSTALL_PROPERTY(edge, properties);
}


/* the graph base class template */
template < typename VERTEXPROPERTIES, typename EDGEPROPERTIES >
class Graph
{
public:

    /* an adjacency_list like we need it */
    typedef adjacency_list<
        setS, // disallow parallel edges
        listS, // vertex container
        bidirectionalS, // directed graph
        property<vertex_properties_t, VERTEXPROPERTIES>,
        property<edge_properties_t, EDGEPROPERTIES>
    > GraphContainer;


    /* a bunch of graph-specific typedefs */
    typedef typename graph_traits<GraphContainer>::vertex_descriptor Vertex;
    typedef typename graph_traits<GraphContainer>::edge_descriptor Edge;
    typedef std::pair<Edge, Edge> EdgePair;

    typedef typename graph_traits<GraphContainer>::vertex_iterator vertex_iter;
    typedef typename graph_traits<GraphContainer>::edge_iterator edge_iter;
    typedef typename graph_traits<GraphContainer>::adjacency_iterator adjacency_iter;
    typedef typename graph_traits<GraphContainer>::out_edge_iterator out_edge_iter;

    typedef typename graph_traits<GraphContainer>::degree_size_type degree_t;

    typedef std::pair<adjacency_iter, adjacency_iter> adjacency_vertex_range_t;
    typedef std::pair<out_edge_iter, out_edge_iter> out_edge_range_t;
    typedef std::pair<vertex_iter, vertex_iter> vertex_range_t;
    typedef std::pair<edge_iter, edge_iter> edge_range_t;


    /* constructors etc. */
    Graph()
    {}

    Graph(const Graph& g) :
        graph(g.graph)
    {}

    virtual ~Graph()
    {}


    /* structure modification methods */
    void Clear()
    {
        graph.clear();
    }

    Vertex AddVertex(const VERTEXPROPERTIES& prop)
    {
        Vertex v = add_vertex(graph);
        properties(v) = prop;
        return v;
    }

    void RemoveVertex(const Vertex& v)
    {
        clear_vertex(v, graph);
        remove_vertex(v, graph);
    }

    EdgePair AddEdge(const Vertex& v1, const Vertex& v2, const EDGEPROPERTIES& prop_12, const EDGEPROPERTIES& prop_21)
    {
        /* TODO: maybe one wants to check if this edge could be inserted */
        Edge addedEdge1 = add_edge(v1, v2, graph).first;
        Edge addedEdge2 = add_edge(v2, v1, graph).first;

        properties(addedEdge1) = prop_12;
        properties(addedEdge2) = prop_21;

        return EdgePair(addedEdge1, addedEdge2);
    }


    /* property access */
    VERTEXPROPERTIES& properties(const Vertex& v)
    {
        typename property_map<GraphContainer, vertex_properties_t>::type param = get(vertex_properties, graph);
        return param[v];
    }

    const VERTEXPROPERTIES& properties(const Vertex& v) const
    {
        typename property_map<GraphContainer, vertex_properties_t>::const_type param = get(vertex_properties, graph);
        return param[v];
    }

    EDGEPROPERTIES& properties(const Edge& v)
    {
        typename property_map<GraphContainer, edge_properties_t>::type param = get(edge_properties, graph);
        return param[v];
    }

    const EDGEPROPERTIES& properties(const Edge& v) const
    {
        typename property_map<GraphContainer, edge_properties_t>::const_type param = get(edge_properties, graph);
        return param[v];
    }


    /* selectors and properties */
    const GraphContainer& getGraph() const
    {
        return graph;
    }

    vertex_range_t getVertices() const
    {
        return vertices(graph);
    }

    adjacency_vertex_range_t getAdjacentVertices(const Vertex& v) const
    {
        return adjacent_vertices(v, graph);
    }

    int getVertexCount() const
    {
        return num_vertices(graph);
    }

    int getVertexDegree(const Vertex& v) const
    {
        return out_degree(v, graph);
    }


    /* operators */
    Graph& operator=(const Graph &rhs)
    {
        graph = rhs.graph;
        return *this;
    }

protected:
    GraphContainer graph;
};

Используя это, вы можете получить доступ к таким свойствам, как это:

struct VertexProperties {
    int i;
};

struct EdgeProperties {
};

typedef Graph<VertexProperties, EdgeProperties> MyGraph;

MyGraph g;

VertexProperties vp;
vp.i = 42;

MyGraph::Vertex v = g.AddVertex(vp);

g.properties(v).i = 23;

Конечно, вы можете есть другие потребности в структуре вашего графа, но модификация приведенного выше кода должна быть довольно простой.

15
ответ дан 27 November 2019 в 17:40
поделиться

Я нашел эти примеры очень полезными. В Windows он будет в вашем каталоге \ Program Files \ boost \ boost_1_38 \ libs \ graph \ example.

kevin_bacon2.cpp использует свойства вершин для хранения имен актеров.

Ваши свойства вершин и ребер могут быть сохранены в регулярные структуры или классы.

1
ответ дан 27 November 2019 в 17:40
поделиться

Как насчет использования объединенных свойств?

using namespace boost;

struct vertex_info { 
    std::string whatever; 
    int othervalue; 
    std::vector<int> some_values; 
};

typedef adjacency_list<vecS, vecS, undirectedS, vertex_info> graph_t;

graph_t g(n);

g[0].whatever = "Vertex 0";

[...]

и так далее.

Я часто использую BGL, и работать со связанными свойствами очень просто ( см. Документацию ).

Другой тип свойства вершины, который я очень часто использую, - это внешние свойства. Вы можете объявить std :: vectors подходящего размера и использовать их как свойства в большинстве случаев и в большинстве алгоритмов.

72
ответ дан 27 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: