如何初始化对

时间:2013-12-16 03:57:52

标签: c++ segmentation-fault

我认为我正在创建这对,因为我在使用DDD进行调试时遇到了段错误。任何人都可以看到我犯了什么错误?谢谢!处理输入文件时会发生段错误:

char vertex = 'a';
Vertex* newVertex = new Vertex();
map.insert(pair<char,Vertex*>(vertex,newVertex));

代码:

void MSTapp::processFile()

{

int pos1;

int pos2;

map<char, Vertex*> adjacencyList;

vector<char> listOrder;

string input;

bool test = false;

while (getline(cin, input)) {

    pos1 = pos2 = 0;

    if(std::string::npos != input.find_first_of("0123456789"))

    {



        char source = input[0];

        char destination = input[2];

        stringstream ss(input.substr(4));       

        int weight;

        ss >> weight;

        Edge newEdge(destination, weight);

        adjacencyList[source]->addEdge(destination, newEdge);

        Edge roadBack(source, weight);

        adjacencyList[destination]->addEdge(source, roadBack);

    }

    else

    {

        while(input.find(' ', pos1) != string::npos)

        {

            pos2 = input.find(' ', pos1);

            char vertex = input[pos1];

            listOrder.push_back(vertex);

            Vertex* newVertex = new Vertex(vertex);

            adjacencyList[vertex] = newVertex;

            pos1 = pos2;

        };

    };

};

Graph graph(listOrder, adjacencyList);

prim(graph, adjacencyList[listOrder[0]]);

}

输入:

A B C D E F G
A B 3
A E 4
B C 7 
B E 6
B F 5
C D 9
C F 8
D F 9
D G 4
E F 6
F G 8

2 个答案:

答案 0 :(得分:2)

有几种方法可以向std::map<K,V>添加项目。最常见的是使用索引运算符,如下所示:

map[vertex] = newVertex;

您也可以通过调用std::make_pair明确建立一对:

map.insert(std::make_pair(vertex,newVertex));

请注意,您不需要指定正在创建的对的类型参数,因为std::make_pair会从上下文中推断出类型。

答案 1 :(得分:0)

如果你能够编译但是在这上面会出现内存错误,我会查看你的std::map<char, Vertex *, ...>的比较函数。 STL的映射应该是红黑平衡二叉树,它在节点上进行小于/不小于比较,因为它插入并重新平衡自身。我猜你要么有一个糟糕的节点比较函数,要么Vertex成员有时会包含错误的指针,这些指针会被insert()调用中的比较函数触及。此外,如上所述调用std :: map实例'map'可能会使示例形式混淆。

编辑:没关系,只看到上面添加的代码,你没有对你的地图定义/比较功能做任何想象。

如果您正在崩溃以下两行之一,则意味着您的节点查找失败,并且您正在尝试修改实际上并不存在的对象。在尝试读取或修改它们之前,请检查这些值(Vertex *):

adjacencyList[source]->addEdge(destination, newEdge);
adjacencyList[destination]->addEdge(source, roadBack);

在Vertex :: addEdge(char,Vertex *)调用上设置断点,查看this的地址和内容显示的内容。 std::map::operator[]会在失败的查找上静默创建一个元素(使用默认构造函数),因此您可能会创建null Vertex * s然后试图向他们添加元素。