【发布时间】:2020-05-13 20:04:25
【问题描述】:
我试图表示一个图表
边缘:
struct edge{
char a;
char b;
int weight;
}
我正在尝试在此数据结构中添加我的图表:
vector<list<edge*>> graph;
在 AddEdge 函数中,我尝试在向量的第 i 个索引中添加列表时遇到内存访问冲突
void Graph::addEdge(char start, char end, int weight)
{
int i = node_number(start); //returns index (e.g 0 if start == 'A')
int j = node_number(end);
Edge *s= new Edge (start, end, weight);
Edge* e=new Edge (end, start, weight);
graph[i].push_back(s); //memory violation
graph[j].push_back(e);
}
现在有人帮我在graph 中添加边。谢谢!
编辑:
我进行了调试,在 push_back() 部分 i 和 j 的值分别为 0 和 1。调试器返回 abort: memory 违规回溯是:
public:
_NODISCARD _Ty& operator[](const size_type _Pos)
{ // subscript mutable sequence
#if _ITERATOR_DEBUG_LEVEL != 0
_STL_VERIFY(_Pos < size(), "vector subscript out of range");
#endif /* _ITERATOR_DEBUG_LEVEL != 0 */
return (this->_Myfirst()[_Pos]);
}
【问题讨论】:
-
弹出
std::cout << graph.size() << ',' << i << std::endl;以确保i在graph[i].push_back(s);之前的范围内。 -
你假设这是保证
i < graph.size(),你可能在其他地方有一个错误,打破了这个假设。在这些情况下,一个简单的assert(assumption)永远不会丢失。 -
用调试器结果更新了帖子。我认为错误在于向量图的初始化,但我不确定如何处理列表向量。
-
要添加到上述 cmets,除了解决问题之外,最好始终检查您是否正在访问其范围内的元素。然后,您有机会处理不正确的情况并做一些明智的事情(显示错误消息,写入日志文件等)