我认为我正在创建这对,因为我在使用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
答案 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然后试图向他们添加元素。