我有一个非常简单的方法,可以在图形中添加一个节点:
template<class T>
void AdjacencyList<T>::add(const GraphNode<T>& node) {
_nodes.push_back(node);
}
Run Code Online (Sandbox Code Playgroud)
在另一种方法中,我迭代_nodes
向量,按地址查找添加的节点:
for (unsigned int i = 0; i < _nodes.size(); i++) {
if (&(_nodes[i]) == &node)
// do something
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为当我添加node
到_nodes
向量时,添加的成员具有不同的地址:
Graph::AdjacencyList<int>::add (this=0x8052338, node=...) at ../AdjacencyList.h:42
42 _nodes.push_back(node);
(gdb) p node
$1 = (const Graph::GraphNode<int> &) @0xbffff39c: {value = 123}
(gdb) n
43 }
(gdb) p _nodes[0]
$4 = (Graph::GraphNode<int> &) @0x80522b0: {value = 123}
Run Code Online (Sandbox Code Playgroud)
世界上到底发生了什么?更重要的是,我应该如何在向量中添加成员以便以后可以找到它?
该对象被复制到向量中,因此存储在向量内的副本的地址肯定不同于原始对象的地址,因为没有两个不同的对象可以具有相同的地址.
要在以后查找对象,您可以将其与其他属性(其中一个或多个成员变量)进行比较,或将其索引存储在某个向量中.通常的方法是每个对象都有一些"标识符"成员变量,至少对于存储在一个向量内的所有对象是唯一的.