在 C++ 中访问列表向量的问题

Posted

技术标签:

【中文标题】在 C++ 中访问列表向量的问题【英文标题】:Problem in accessing vectors of list in c++ 【发布时间】: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 &lt;&lt; graph.size() &lt;&lt; ',' &lt;&lt; i &lt;&lt; std::endl; 以确保igraph[i].push_back(s); 之前的范围内。 你假设这是保证i &lt; graph.size(),你可能在其他地方有一个错误,打破了这个假设。在这些情况下,一个简单的assert(assumption) 永远不会丢失。 What is a debugger and how can it help me diagnose problems? 用调试器结果更新了帖子。我认为错误在于向量图的初始化,但我不确定如何处理列表向量。 要添加到上述 cmets,除了解决问题之外,最好始终检查您是否正在访问其范围内的元素。然后,您有机会处理不正确的情况并做一些明智的事情(显示错误消息,写入日志文件等) 【参考方案1】:

问题在于向量的大小,因为下面的初始化分配 size=0

vector<list<edge*>> graph;

我已通过在推送前调整图形向量的大小来修复代码。 另一种解决方案是通过

给出初始大小
vector<list<edge*>> graph(20);

【讨论】:

以上是关于在 C++ 中访问列表向量的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何访问在 C++ 中通过引用传递的列表/向量的元素

C++向量内存访问问题

访问列表向量中的结构

访问工作线程的 lambda 中捕获的向量列表中元素的引用时是不是需要互斥锁?

R访问Array内部列表中的向量

c++ 内存分配向量的指针