C++ 如何创建向量数组

C++ 如何创建向量数组,c++,C++,如何正确初始化向量数组 图形.h class Graph { public: Graph(int vertices); private: vector<int> adjacencyLists[]; } 类图 { 公众: 图(int顶点); 私人: 向量邻接柱状图[]; } 图表.cpp Graph::Graph(int vertices) { adjacencyLists = new vector<int>[vertices];

如何正确初始化向量数组

图形.h

class Graph
{
public:
    Graph(int vertices); 
private:
    vector<int> adjacencyLists[];
}
类图
{
公众:
图(int顶点);
私人:
向量邻接柱状图[];
}
图表.cpp

Graph::Graph(int vertices)
{       
    adjacencyLists = new vector<int>[vertices];
}
Graph::Graph(int顶点)
{       
邻接柱状图=新向量[顶点];
}
错误:

error: incompatible types in assignment of 'std::vector<int>*' to 'std::vector<int> [0]'
 adjacencyLists = new vector<int>[vertices];
                ^
错误:将'std::vector*'赋值给'std::vector[0]时类型不兼容
邻接柱状图=新向量[顶点];
^
更改:

vector<int> adjacencyLists[];
向量邻接列表[];
致:

vector*邻接列表;
更改:

vector<int> adjacencyLists[];
向量邻接列表[];
致:

vector*邻接列表;

对于您的用例(一个动态分配的数组,在构建后无法更改大小),最适合您的是。遗憾的是,这目前还不在标准中。下面是它的工作原理:

dynarray<vector<int>> adjacencyLists;

Graph::Graph(int vertices) : adjacencyLists{vertices} {}
或者,如果您真的想自己管理它,您可以将它存储在一个
唯一的\u ptr

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

Graph::Graph(int vertices)
    : adjacencyLists{new vector<int>[vertices]}
    , numVertices{vertices}
{}
唯一的邻接列表;
智力;
Graph::Graph(int顶点)
:邻接柱状图{新向量[顶点]}
,numVertices{vertices}
{}
使用这种方法,您几乎肯定也想存储
邻接列表的大小(如上所示),否则您将无法遍历数组,因为您不知道它有多大


无论你做什么,永远不要有一个原始指针自己的内存。它应该始终是一个
唯一的\u ptr
共享的\u ptr
或某个容器。如果使用<代码>删除<代码>关键字,它不是现代C++。

对于用例来说,完美的东西(动态分配的数组,它在构造后不能改变大小)是。遗憾的是,这目前还不在标准中。下面是它的工作原理:

dynarray<vector<int>> adjacencyLists;

Graph::Graph(int vertices) : adjacencyLists{vertices} {}
或者,如果您真的想自己管理它,您可以将它存储在一个
唯一的\u ptr

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

Graph::Graph(int vertices)
    : adjacencyLists{new vector<int>[vertices]}
    , numVertices{vertices}
{}
唯一的邻接列表;
智力;
Graph::Graph(int顶点)
:邻接柱状图{新向量[顶点]}
,numVertices{vertices}
{}
使用这种方法,您几乎肯定也想存储
邻接列表的大小(如上所示),否则您将无法遍历数组,因为您不知道它有多大



无论你做什么,永远不要有一个原始指针自己的内存。它应该始终是一个
唯一的\u ptr
共享的\u ptr
或某个容器。如果使用<代码>删除<代码>关键字,它不是现代C++。有人怎么知道这是一个数组?你该怎么办?永远不要将数组用作类的变量?相反,只使用指针?这不清楚,但它可以在不进行重组的情况下完成工作。就我个人而言,我会使用向量的向量(正如@David所指出的)。你也可以问关于
const char*
变量的“你怎么知道它是数组”问题。如果我有一个
MyRandomClass
数组呢?那我该怎么办?使用令人困惑的指针符号,或者使用
向量
而不是数组?我觉得不正确。一般来说,因为你在写C++,你应该使用C++构造,所以我会用向量。另外请注意,如果数组大小是静态的,则可以使用std::array,它具有类似向量的界面的所有优点,并且具有恒定的内存占用。动态阵列并不是一场全球性的热核战争,但唯一正确的做法是不要玩。这是一个清晰的解决方案吗?有人怎么知道这是一个数组?你该怎么办?永远不要将数组用作类的变量?相反,只使用指针?这不清楚,但它可以在不进行重组的情况下完成工作。就我个人而言,我会使用向量的向量(正如@David所指出的)。你也可以问关于
const char*
变量的“你怎么知道它是数组”问题。如果我有一个
MyRandomClass
数组呢?那我该怎么办?使用令人困惑的指针符号,或者使用
向量
而不是数组?我觉得不正确。一般来说,因为你在写C++,你应该使用C++构造,所以我会用向量。另外请注意,如果数组大小是静态的,则可以使用std::array,它具有类似向量的界面的所有优点,并且具有恒定的内存占用。动态阵列并不是一场全球性的热核战争,但唯一正确的做法是不要玩。我想我会使用阵列,因为外部的“向量”是静态大小的。那么为什么不使用数组呢。正确的?然而,这个问题仍然存在。如果我想要一个
MyRandomClass
数组,我该怎么办?如果你看@ColinBasnett的答案,这是一个使用指针的解决方案,但我的问题是,我是否不应该在头文件中使用
[]
?我不理解C++的惯例,当谈到数组时,我想你的意思是大小永远不变,但这并不等同于它是静态的。您可以在运行时将其作为参数接受。在任何情况下,我都会更新更多选项…正确。这是运行时的一个参数,以后永远不会更改。按照这个逻辑,任何人都不应该使用数组,而只使用向量?@Shiro用于动态分配的数组?是的,差不多。对于静态大小的数组(也就是说,大小在编译时已知)使用
std::array
。我想我应该使用array,因为外部的“vector”是静态大小的。那么为什么不使用数组呢。正确的?然而,这个问题仍然存在。如果我想要一个
MyRandomClass
数组,我该怎么办?如果你看@ColinBasnett的答案,这是一个使用指针的解决方案,但我的问题是,我是否不应该在头文件中使用
[]
?我不懂规矩