这是一个名为 的类的构造函数Graph
。在构造函数中,我试图初始化一些东西,这是可以工作的构造函数,即它运行并完成:
Graph(const float density, const int numVertex = 50): numEdges(0) {
graph.resize(numVertex, vector<Vertex>(numVertex));
for (int s = 0; s < numVertex; ++s) {
for (int k = 0; k < s; ++k )
if (edge_exist(density)) {
graph[s][k].visited = graph[k][s].visited = false;
graph[s][k].distance = graph[k][s].distance = _MAX;
++numEdges;
int distance = rand() % 10 + 1;
graph[s][k].edges.emplace_back(piiv(distance, graph[k][s]));
graph[k][s].edges.emplace_back(piiv(distance, graph[s][k]));
}
}
}
typedef pair<int, Vertex> piiv;
vector<vector<Vertex> > graph;
该类有一个名为的字段graph
,它是名为 的结构向量的向量Vertex
。
typedef struct vert {
std::list<std::pair<int, vert> > edges;
int distance;
bool visited;
} Vertex;
现在,如果我让顶点结构保持原样,而是使向量只是一个一维向量
vector<Vertex> graph;
并将构造函数更改为:
Graph(const float density, const int numVertex = 50): numEdges(0) {
graph.resize(numVertex);
for (int s = 0; s < numVertex; ++s) {
for (int k = 0; k < s; ++k )
if (edge_exist(density)) {
graph[s].visited = graph[k].visited = false;
graph[s].distance = graph[k].distance = _MAX;
++numEdges;
int distance = rand() % 10 + 1;
graph[s].edges.emplace_back(piiv(distance, graph[k]));
graph[k].edges.emplace_back(piiv(distance, graph[s]));
}
}
}
现在,这种更改导致代码运行的时间比它通常在向量是二维时的运行时间要长得多。我没有耐心弄清楚它运行了多长时间,但我知道它的运行速度比第一个慢得多,而且没有明显的原因。对我来说不是很明显,但我敢打赌这里有人对为什么会这样有一些见解。
所以我的问题是,是什么导致程序出现这种看似不必要的延迟?如果有帮助,这就是构造函数的调用方式:
Graph G(0.4);
我已经跟踪到问题来自第二个构造函数实现中的最后两行:
graph[s].edges.emplace_back(piiv(distance, graph[k]));
graph[k].edges.emplace_back(piiv(distance, graph[s]));
所以我想真正的问题是上面的内容与第一个构造函数中所做的有什么不同?
编辑
答对了! 在调试时,我决定将 Vertex 结构更改为这样声明:
typedef struct vert {
std::list<std::pair<int, vert&> > edges;
int distance;
bool visited;
} Vertex;
这似乎解决了问题,但为什么呢?与按引用传递相比,为什么按值传递 Vertex 对象不起作用?