C++ 如何使用c+;中模板图类中的向量创建邻接矩阵+;?

C++ 如何使用c+;中模板图类中的向量创建邻接矩阵+;?,c++,matrix,vector,graph,C++,Matrix,Vector,Graph,是的,这是一个家庭作业(在你问之前),但我遇到了麻烦,我觉得这里的人比我的CS同学们要不那么自命不凡 我的问题是,在二维C++中使用二维向量在模板图类中创建矩阵需要做什么。我总是能想象我需要做什么,但在打字时遇到了麻烦 以下是我到目前为止的情况: using namespace std; namespace GraphNameSpace { enum isDirected {DIRECTED, UNDIRECTED}; enum isWeighted {WEIGHTED, UNW

是的,这是一个家庭作业(在你问之前),但我遇到了麻烦,我觉得这里的人比我的CS同学们要不那么自命不凡

我的问题是,在二维C++中使用二维向量在模板图类中创建矩阵需要做什么。我总是能想象我需要做什么,但在打字时遇到了麻烦

以下是我到目前为止的情况:

using namespace std;

namespace GraphNameSpace
{

   enum isDirected {DIRECTED, UNDIRECTED};
   enum isWeighted {WEIGHTED, UNWEIGHTED};

   template <class T>
   class Graph
   {
      public:
         Graph<T>();
         Graph<T>(isDirected);
         Graph<T>(isWeighted);
         Graph<T>(isDirected, isWeighted);
         Graph<T>(isWeighted, isDirected);

         void createMatix();
         void destroy();
         bool isEmpty() const;
         bool isFull() const;
         bool isAdjacentTo(T fromVertex, T toVertex) const;
         int edgeWeight(T fromVertex, T toVertex) const;
         int edgeCount() const;
         int vertexCount() const;
         void insertVertex(T Vertex);
         void insertEdge(T fromVertex, T toVertex, int weight);
         void deleteVertex(T Vertex);
         void deleteEdge(T fromVertex, T toVertex);
         int findVertex(T Vertex) const;
         void dump() const;

      private:
         vector<int> row(100);
         int numVertices;
         int numEdges;
         static isDirected dir;
         static isWeighted wght;
   };
}
使用名称空间std;
命名空间图形命名空间
{
枚举是有方向的{有方向的,无方向的};
枚举加权{加权,未加权};
模板
类图
{
公众:
图();
图形(isDirected);
图(加权);
图形(定向、加权);
图形(加权、定向);
void createMatix();
无效销毁();
bool isEmpty()常量;
bool isFull()常量;
布尔是邻接(T从顶点,T到顶点)常数;
int EDGEWIGHT(T从顶点,T到顶点)常数;
int edgeCount()常量;
int vertexCount()常量;
void insertVertex(T顶点);
void insertEdge(T fromVertex,T to vertex,int-weight);
void delete顶点(T顶点);
void deleteEdge(T从顶点,T到顶点);
int findVertex(T顶点)常数;
无效转储()常量;
私人:
向量行(100);
智力;
国际努梅德斯;
静态定向定向;
静态加权wght;
};
}

我猜问题出在向量行(100)上,但也可能出在void createMatrix()上。我只是拼命想弄明白如何做到这一点,所以如果能用示例代码进行解释,我将不胜感激。(代码的其余部分正是他想要的)。提前感谢您尝试帮助我,非常感谢。

似乎您需要一个T的二维向量来存储顶点

大概是这样的:

vector < vector < T > > Vertices;
vector < V > vertices;
vector < E > edges;
struct adjacency_s {
   int src;
   int dst;
   int edge;
};
vector < adjacency_s > adjacencies;
vector>顶点;
然而,这是非常低效的

也许要做的事情是拥有一个顶点的一维向量,然后定义一条边,并将所有边存储在另一个一维向量中。如果需要,您可以根据此动态生成邻接矩阵

vector < T > vertices;
typedef pair <int,int> edge_t;    // Indices into vertices vector
vector < edge_t > edges;
向量顶点;
typedef对边_t;//索引到顶点向量
向量<边>边;
这不会浪费内存

我看到的问题是,在该方案中,无法存储边缘的属性(例如重量、长度或成本)。为此,需要同时为边和顶点创建模板

 template <class V, class E>
   class Graph
模板
类图
因此,现在需要一个用于用户边的向量,一个用于顶点的向量,以及一个用于三个索引的向量:源vetrex、目标顶点和边

也许是这样的:

vector < vector < T > > Vertices;
vector < V > vertices;
vector < E > edges;
struct adjacency_s {
   int src;
   int dst;
   int edge;
};
vector < adjacency_s > adjacencies;
向量顶点;
向量边;
结构邻接{
int-src;
int dst;
内缘;
};
向量<邻接>邻接;

实际上,滚动自己的图形代码是个坏主意。最好学习如何使用已建立的库,如

“static isDirected dir;”前面有麻烦!使用静态意味着每个实例都有相同的价值——几乎肯定不是你想要的。“但我遇到了麻烦,我觉得这里的人没有我的CS同学那么自命不凡。”——一条建议:无论是在学习、研究还是工作中,相互交谈并共同解决问题都非常重要。你很可能会从其他观点中学习,并从中获得更多乐趣。我在我的研究领域有朋友,我确实会征求他们的意见,我通常在其他领域也会这样做,但我只是有一种感觉(老实说,我是一个非常善于社交的人),这个部门的大多数人都觉得他们比你强,只是因为他们在这方面知道得更多。他们愿意帮忙,但觉得有必要为你不知道他们在做什么而感到羞愧。我会使用已建立的库,但出于作业目的,我们应该学习如何使用(据我所知)邻接矩阵或邻接列表自己创建模板图类。这可以通过数组、向量或映射来完成。我不知道什么是最好的方法,是的,我们必须有权参与,不管它实际上是一个加权图,还是仅仅有一个int 1的填充物。我已经描述了我认为最好的方法。有一个列表(或向量)的邻接只是存储图表的一种方式。为枚举顶点创建一个矩阵只是实现这一点的另一种主要方法。对于密集图,它可能是好的(内存与访问时间)。OP被要求做一个邻接矩阵(或不做),而你只是建议不做它而不去正反两方面。我喜欢你展示备选方案,但说矩阵“糟糕”(这要看情况而定)让我感到厌烦。@Maikel在绝大多数现实问题中,邻接矩阵是极其稀疏的。作为一个通用的图形数据结构,矩阵是很糟糕的。@ravenpoint是的,我完全同意!我也相信你比我更了解图表;-)。我只想指出这个问题的研究方面。