【问题标题】:fill into the a vector holding pointers to lists填充到包含指向列表的指针的向量中
【发布时间】:2014-05-02 08:42:56
【问题描述】:

我初始化一个指针向量,每个指针指向一个邻居列表,以实现 Graph 的邻接列表表示。

class Graph
{
public:
     Graph(int V) : vertices(V) {}
     // Member functions for Graph class
     void addEdge();
     void print();
     void type(string);
private:
     vector<list<int> *> vertices;
};

addEdge 函数要求用户输入从哪个顶点到另一个顶点的边。我认为在填充向量时某处有错误。

void Graph::addEdge()
{
    int v, w;
    cout << "\nvertex: ";
    cin >> v;
    cout << "\nadjacent: ";
    cin >> w;
    vertices[v]->push_back(w);
}

如果这是填充我介绍的数据结构的正确方法,我需要帮助!如果不是,那么执行任务的正确方法是什么?

【问题讨论】:

  • 为什么向量中包含指针?您是否在任何地方分配和添加这些列表?
  • 我在 [您的上一个问题](stackoverflow.comAC/questions/23415287/initializing-a-vector-to-a-list-of-integers) 中提出的相同问题适用于此:你为什么需要存储指向列表的指针吗?
  • 您可以使用boost::graph,而不是重新发明轮子。
  • @molbdnilo - 因为图的邻接列表表示需要一个数组/向量持有指向包含特定顶点相邻点的数组/向量/列表的指针。
  • @mehdix_ 邻接表表示不需要指针,它需要一个动态大小的集合。 vectorlist 就是这样的集合,vector 通常效率更高。

标签: c++ list vector graph


【解决方案1】:

我建议您使用std::vector&lt;std::vector&gt; 作为图表的adjacency matrix,并且建议您不要将 UI 与您的类混用(参见下面的代码):

class Graph
{
public:
  Graph(std::size_t const n_vert) : adjmat(n_vert, std::vector<int>(n_vert)) {}
     // Member functions for Graph class
     void addEdge(std::size_t const from, std::size_t const to, int const weight);
     void print();
     void type(std::string);
private:
     std::vector<std::vector<int>> adjmat;
};

void Graph::addEdge(std::size_t const from, std::size_t const to, int const weight = 1)
{
  // or `adjmat.at(from).at(to)` for range checking
  adjmat[from][to] = weight;
}

int main ()
{
    Graph G(10);
    int v, w;
    std::cout << "\nvertex: ";
    std::cin  >> v;
    std::cout << "\nadjacent: ";
    std::cin  >> w;
    G.addEdge(v, w);

    return 0;
}

不过,对于小型图表,建议使用此解决方案。

【讨论】:

  • 应该始终提到,std::vector&lt;std::vector&gt; 仅适用于 C++11 移动语义。对于那些坚持使用 C++03 的人,Boost.Container 可以很好地模拟它。
猜你喜欢
  • 2018-08-28
  • 2016-01-23
  • 1970-01-01
  • 2011-08-04
  • 2018-05-30
  • 2013-07-12
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多