如何正确初始化向量数组?
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];
^
答案 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_ptr
,shared_ptr
或某个容器。如果您使用delete
关键字,那么它不是现代的c ++。
答案 1 :(得分:1)
变化:
vector<int> adjacencyLists[];
要:
vector<int>* adjacencyLists;