gpt4 book ai didi

c++ - 如何复制列表 vector ?

转载 作者:行者123 更新时间:2023-11-28 07:12:51 29 4
gpt4 key购买 nike

在我的程序中,我需要复制(甚至使用)一个 private数据结构到一个完全不同的类的 .cpp 文件中。目前我什至只是简单地远程访问它都遇到了麻烦,当我尝试打印它时它会出现故障。这是我的类的数据结构的简化版本:

class Graph
{
private:
class Edge
{
public:
Edge(string vertex, int weight)
{
m_vertex = vertex;
m_weight = weight;
}
~Edge(){}
string m_vertex;
int m_weight;
};
vector< list<Edge> > adjList;
public:
Graph();
~Graph();
vector < list < Edge > > get_adjList(){return adjList;}
//Other functions....

};

在一个完全不同的函数中,我尝试这样做...

void MinPriority::testPrint(string targetVertex) //FOR TESTING PURPOSES SO FAR (FAILS TO WORK) SEGMENTATION FAULT NO MATTER WHAT
{

targetVertex = "A";
Graph graph;
graph.adjList = graph.get_adjList(); //adjList is our empty container based on the array of linked lists
/*1*/cout << graph.get_adjList()[0].front().m_vertex << " TEST!" << endl;

/*2*/cout << "The very first vertex is: ";
if(graph.adjList.size() == 0)
cout << "NULL<!>" << endl;
else cout << graph.adjList[0].front().m_vertex << endl;
}

请注意,我将 targetVertex 设置为“a”,因此我的程序可以编译,因为我在我的 makefile 中包含了 -Werror(赋值需要)。当我注释掉 /*1*/ 时然后跑到/*2*/输出将始终为 "The very first vertex is: NULL<!>" ,无论数据结构中有多少元素。在 /*1*/我尝试打印出函数 get_adjList() 返回的对象但它会在阅读时出现错误:

Exception: STATUS_ACCESS_VIOLATION at eip=611298C5
eax=0A0A0A0A ebx=01010101 ecx=20050884 edx=F5F5F5F5 esi=20058488 edi=20060000
ebp=0028A8D8 esp=0028A8D0 program=C:\cygwin\home\Ryan\311\P5Dec16\Graph.exe, pid 5612, thread main
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame Function Args
0028A8D8 611298C5 (20058400, 0000000A, 20058488, 610FD3CA)
0028A938 6115F91F (0028D41C, 61187720, 0028A958, 0043455D)
0028A988 61137BF7 (0028D41C, 20058400, 00000001, 20058488)
0028A9B8 61137CD5 (20058400, 00000001, 20058488, 61187720)
0028A9D8 610D6745 (00449240, 20058400, 20058488, 004493C4)
0028AA68 004439BA (004493C0, 6123D5FC, 004452B4, 0028AAA0)
0028AB08 00402756 (0028AC20, 0028ABB0, 20010100, 004011C1)
0028AC68 00401583 (00000001, 0028AC90, 20010100, 612757A2)
0028ACF8 6100763A (00000000, 0028CD78, 61006C50, 00000000)
End of stack trace
Segmentation fault (core dumped)

基本上简而言之,我想知道这个堆栈跟踪是什么(我以前遇到过段错误,但我从未见过这个)。我想知道如何从 #include "Graph.h" 的其他文件中的类 Graph 正确访问数据结构.我也不确定如何在 testPrint(); 中复制我的对象.为什么这在 Graph.cpp 中完美运行?

void Graph::set_array(string vertex)
{
//increment vector size by 1 and insert a new Edge object into the vector of linked lists
cout << "ADDING " << vertex << " TO VECTOR" << endl;
adjList.resize(adjList.size() + 1);
adjList[adjList.size() - 1].push_back(Edge(vertex, 0));
}

最佳答案

Graph graph;

如您所述,Graph 的默认构造函数不执行任何操作。所以此时,graph.adjList 是空的。

graph.adjList = graph.get_adjList();

这是一个毫无意义的语句,它从自身的拷贝分配给 graph.adjList。因为之前是空的,所以现在还是空的。

cout << graph.get_adjList()[0].front().m_vertex << " TEST!" << endl;

这会尝试访问 graph.adjList(的拷贝)的第一个元素。但是 graph.adjList 是空的 (即它没有第一个元素),所以这是未定义的行为。它可能是也可能不是您的段错误的原因,但它肯定是一个必须在进行任何进一步有用的调试之前解决的问题。

关于c++ - 如何复制列表 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20714856/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com