如何在std::list中插入一个新结构

How to insert a new struct into std::list?

本文关键字:结构 一个 新结构 插入 std list      更新时间:2023-10-16

好的,所以我有一个名为DigraphEdge的结构的std::列表。

以下是3个关键代码段:

//DigraphVertex Struct    
template <typename VertexInfo, typename EdgeInfo>
struct DigraphVertex
{
VertexInfo vinfo;
std::list<DigraphEdge<EdgeInfo>> edges;
DigraphVertex(VertexInfo v, std::list<DigraphEdge<EdgeInfo>> l) : vinfo(v), edges(l) {}
}
//DigraphEdge struct
template <typename EdgeInfo>
struct DigraphEdge
{
int fromVertex, toVertex;
EdgeInfo einfo;
DigraphEdge(int from, int to, EdgeInfo e) : fromVertex(from), toVertex(to), einfo(e) {}
}
//map that contains vertices and information about the vertices
std::map<int, DigraphVertex<VertexInfo,EdgeInfo>> digraphMap;

基本上,贴图包含一个关键点(int)和一个顶点(DigraphVertex)。每个顶点都包含有关该顶点(vinfo)的信息以及DigraphEdge类型的传出边的列表。每条边都包含关于边开始(从顶点)和结束(到顶点)的顶点的信息,以及关于该边的信息(einfo)。

关键点是自定义的,并且始终与fromVertex相同。例如,如果我有一条从0到9、从0到3的边,这两条边都将存储在键0的边列表中。

有一个名为addEdge的函数,我遇到了问题。addEdge包含3个方面;int from Vertex、int to Vertex和EdgeInfo einfo。基本上,我需要做的是将一条新边添加到位于键/fromVertex的边列表中。

我一直在这样做,但编译器没有识别std::list中存在的插入函数。老实说,我不知道该如何添加到该列表中。我觉得这是一种迂回的方法,可以在addEdge中创建一个新列表,将所有现有边复制到该列表中,添加新边,然后将新边集设置为与旧列表相等。

template <typename VertexInfo, typename EdgeInfo>
void Digraph<VertexInfo, EdgeInfo>::addEdge(int fromVertex, int toVertex, const EdgeInfo& einfo)
{
//check if the edge already exists// 
digraphMap.find(fromVertex)->second.edges.insert(new DigraphEdge<EdgeInfo>(fromVertex,toVertex,einfo));
}

编辑:啊,是的,DigraphEdge只接受一个模板。但是nvm,我想明白了。我必须显式地创建一个DigraphEdge对象,然后对该对象调用push_back,而不是执行新的DigraphEdge。

对于任何对解决方案感兴趣的人。。。

DigraphEdge<EdgeInfo> newEdge(fromVertex, toVertex, einfo);
digraphMap.find(fromVertex)->second.edges.push_back(newEdge);

可能有打字错误??

template <typname VertexInfo, typename EdgeInfo>
struct DigraphEdge

DigraphEdge(更不用说typname)应该接受两个参数,VertexInfo和EdgeInfo。你仍然用一个打电话。新DigraphEdge(从顶点到顶点,einfo)

对于您的主要问题,您正在为插入创建一个指向DigraphEdge的指针,其中您的列表包含Digraph边缘,而不是指向的指针。