c++ - 为什么添加到 C++ STL vector 的对象地址与其原始地址不同?

标签 c++ stl

我有一个非常简单的方法可以将节点添加到图形中:

  template<class T>
  void AdjacencyList<T>::add(const GraphNode<T>& node) {
    _nodes.push_back(node);
  }

在另一种方法中,我遍历 _nodes vector ,通过地址查找添加的节点:

for (unsigned int i = 0; i < _nodes.size(); i++) {
  if (&(_nodes[i]) == &node)
    // do something
}

但是,这不起作用,因为当我将 node 添加到 _nodes vector 时,添加的成员具有不同的地址:

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}

这到底是怎么回事?更重要的是,我应该如何将一个成员添加到 vector 中以便我以后可以找到它?

最佳答案

对象被复制到 vector 中,因此存储在 vector 中的拷贝地址肯定不同于原始对象的地址,因为没有两个不同的对象可以具有相同的地址。

要稍后找到您的对象,您可以通过一些其他属性(它的多个成员变量之一)来比较它,或者将它的索引存储在 vector 中的某个地方。通常的做法是,每个对象都有一些“标识符”成员变量,至少对于存储在一个 vector 中的所有对象而言,该变量是唯一的。

关于c++ - 为什么添加到 C++ STL vector 的对象地址与其原始地址不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5712818/

相关文章:

c++ - #定义一个变量值?预处理指令

c++ - 如何在可变大小的 vector 上使用叉积

来自编译器的c++类型错误消息,这是什么意思?

c++ - 使用 STL 排序就地排序表

c++ - coredump:读取文件内容到 std::string

c++ - c++获取unordered_map vector 的unordered_map值

c++ - 在 C++ 中查找大于 4GB 的文件?

c++ - 定义一个函数,使其可以接受列表或 vector

c++ - 为什么 STL 需要一个临时迭代器变量来编译它?

c++ - 成员指针函数列表