我正在嘗試存盤 to 的映射,VALUE但Node*在每個之后addEdge,添加的鍵 ( Node*) 的值都會發生變化。
一個例子是,如果我呼叫addEdge(u, v),地圖會正確顯示生命周期內的所有資料。如果再次呼叫addEdge(u, w),則鍵u, v存在但值“損壞”?這是一個輸出示例:

示例代碼:
struct Node {
VALUE value;
Node* prev;
Node* next;
};
class Graph {
std::map<VALUE, Node*> nodes;
};
void Graph::addEdge(VALUE u, VALUE v) {
Node* uNode;
Node* vNode;
if (nodes.count(u) == 0) {
uNode = &Node{ u, nullptr, nullptr };
nodes.emplace(u, uNode);
} else {
uNode = nodes.at(u);
}
if (nodes.count(v) == 0) {
vNode = &Node{ v, nullptr, nullptr };
nodes.emplace(v, vNode);
} else {
vNode = nodes.at(v);
}
uNode->next = vNode;
vNode->prev = uNode;
}
我試過nodes.emplace分配后打電話,next, prev但沒有解決。謝謝!
編輯 更新的 addEdge:
void addEdgeVALUE u, VALUE v) {
Node* uNode;
Node* vNode;
bool isUNodePresent = true;
bool isVNodePresent = true;
if (nodes.count(u) == 0) {
isUNodePresent = false;
uNode = new Node(u, nullptr, nullptr);
} else {
uNode = &nodes.at(u);
}
if (nodes.count(v) == 0) {
isVNodePresent = false;
vNode = new Node(v, nullptr, nullptr);
} else {
vNode = &nodes.at(v);
}
uNode->next = vNode;
vNode->prev = uNode;
if (!isUNodePresent) nodes.emplace(u, *uNode);
if (!isVNodePresent) nodes.emplace(v, *vNode);
}
uj5u.com熱心網友回復:
您最初addEdge使用的是未命名的臨時物件的地址,這不是有效的 C 。
您更新addEdge的節點指向泄漏Node的 s new,而不是Node地圖中的 s 。
您不必測驗地圖中的存在,map::emplace不會覆寫現有專案,并且回傳值包含Node對該鍵的參考。
struct Node {
VALUE value;
Node* prev;
Node* next;
};
class Graph {
std::map<VALUE, Node> nodes;
public:
void addEdge(VALUE u, VALUE v);
};
void Graph::addEdge(VALUE u, VALUE v) {
Node & uNode = nodes.emplace(u, { u }).first->second;
Node & vNode = nodes.emplace(v, { v }).first->second;
uNode.next = &vNode;
vNode.prev = &uNode;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425199.html
上一篇:如何在C中解釋對指標的賦值
下一篇:放置新操作員
