如何创建向量数组

时间:2016-02-26 22:38:38

标签: c++

如何正确初始化向量数组?

Graph.h

class Graph
{
public:
    Graph(int vertices); 
private:
    vector<int> adjacencyLists[];
}

Graph.cpp

Graph::Graph(int vertices)
{       
    adjacencyLists = new vector<int>[vertices];
}

错误:

error: incompatible types in assignment of 'std::vector<int>*' to 'std::vector<int> [0]'
 adjacencyLists = new vector<int>[vertices];
                ^

2 个答案:

答案 0 :(得分:2)

对于您的用例(动态分配的数组,在构造之后无法改变大小),您的完美之处是std::dynarray。可悲的是,这目前还不符合标准。以下是它的工作原理:

dynarray<vector<int>> adjacencyLists;

Graph::Graph(int vertices) : adjacencyLists{vertices} {}

由于它还没有达到标准,我会选择vector(这实际上是dynarray的超集,所以它的用法完全相同):< / p>

vector<vector<int>> adjacencyLists;

Graph::Graph(int vertices) : adjacencyLists{vertices} {}

或者,如果你真的想自己管理它,你可以将它存储在unique_ptr

unique_ptr<vector<int>[]> adjacencyLists;
int numVertices;

Graph::Graph(int vertices)
    : adjacencyLists{new vector<int>[vertices]}
    , numVertices{vertices}
{}

使用这种方法,您几乎肯定也想要存储adjacencyLists的大小(如上所示),否则您将无法通过数组进行迭代,因为您不会知道它有多大。

无论你做什么,都不要有原始指针拥有内存。它应该始终是unique_ptrshared_ptr或某个容器。如果您使用delete关键字,那么它不是现代的c ++。

答案 1 :(得分:1)

变化:

vector<int> adjacencyLists[];

要:

vector<int>* adjacencyLists;