如何将新结构插入到std :: list中?

时间:2016-06-03 06:55:56

标签: c++ c++11

好的,我有一个名为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的传出边的列表。每条边包含有关边开始(fromVertex)和end(toVertex)的顶点的信息,以及有关该边(einfo)的信息。

密钥是自定义的,并且始终与fromVertex相同。例如,如果我有0到9之间的边,0到3 ---这两个边都将存储在按键0的边列表中。

这个名为addEdge的函数我遇到了问题。 addEdge包含3件事; int fromVertex,int toVertex和EdgeInfo einfo。基本上我需要做的是在key / 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只需要1个模板。但是,我想通了。我必须显式创建一个DigraphEdge对象,然后在该对象上调用push_back而不是新的DigraphEdge。

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

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

1 个答案:

答案 0 :(得分:0)

可能有拼写错误?

template <typname VertexInfo, typename EdgeInfo>
struct DigraphEdge

DigraphEdge(更不用说typname)应该采用2个参数,VertexInfo和EdgeInfo。你仍然打电话给一个。 新的DigraphEdge(fromVertex,toVertex,einfo)

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