我正在实施双连通分量算法。在图表表示中有几个只读方法可以返回一个副本。如何更改这些以返回实际参考而不是副本?我很迷惑。学习这些东西有很好的资源吗?以下是一些例子:
获得邻居顶点。
list<Vertex> Vertex::getNeighbors() const {
return this->_neighbors;
}
获得边缘
vector<Edge> Graph::getEdges() const {
unordered_set<string> distinctEdges;
vector<Edge> edges;
for (auto vertex = _verticies.begin(); vertex != _verticies.end(); vertex++) {
auto neighbors = vertex->getNeighbors();
for (auto neighbor = neighbors.begin(); neighbor != neighbors.end(); neighbor++) {
Edge e(*vertex, *neighbor);
if (distinctEdges.count(e.str()) > 0) {
continue;
}
distinctEdges.insert(e.str());
edges.push_back(e);
}
}
return edges;
}
更新: 我需要引用,以便稍后可以使用以下内容更新它:
void Graph::updateVertex(size_t id, size_t level) {
auto u = this->_findVertex(Vertex(id));
if (u == this->_verticies.end()) {
return;
}
u->level = level;
}
如果是副本,则不会更新原件。感谢。
答案 0 :(得分:1)
要从函数返回对类的私有成员的只读引用,您需要将函数的返回类型更改为const T&
,其中T
是您想要的类型。
现在关于从函数返回对局部变量的引用。局部变量仅在它们在范围内时存在,然后它们超出范围,它们被销毁。这意味着返回的局部变量引用无效,返回变量的唯一方法是按值。
答案 1 :(得分:0)
你需要先问问自己,为什么需要参考。
例如,您应该返回const list<Vertex>&
。
这里你不能返回引用,因为你要返回的是一个局部变量。
在这两种情况下,您都无法获得返回引用。如果你考虑性能或大小 - 忘掉它,编译器会优化它,你不会看到差异。