Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么要将对象的地址添加到C++;STL向量与其原始地址不同?_C++_Stl - Fatal编程技术网

C++ 为什么要将对象的地址添加到C++;STL向量与其原始地址不同?

C++ 为什么要将对象的地址添加到C++;STL向量与其原始地址不同?,c++,stl,C++,Stl,我有一个非常简单的方法,可以将节点添加到图形中: template<class T> void AdjacencyList<T>::add(const GraphNode<T>& node) { _nodes.push_back(node); } 但是,这不起作用,因为当我将节点添加到\u节点向量时,添加的成员具有不同的地址: Graph::AdjacencyList<int>::add (this=0x8052338

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

  template<class T>
  void AdjacencyList<T>::add(const GraphNode<T>& node) {
    _nodes.push_back(node);
  }
但是,这不起作用,因为当我将
节点
添加到
\u节点
向量时,添加的成员具有不同的地址:

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}
Graph::AdjacencyList::在../AdjacencyList.h:42处添加(this=0x8052338,node=…)
42个节点。向后推(节点);
(gdb)p节点
$1=(常量图形::GraphNode&@0xbffff39c:{value=123}
(gdb)n
43      }
(gdb)p_节点[0]
$4=(Graph::GraphNode&@0x80522b0:{value=123}
这到底是怎么回事?更重要的是,我应该如何将一个成员添加到向量中,以便以后可以找到它?

对象被复制到向量中,因此存储在向量中的副本地址肯定与原始对象的地址不同,因为没有两个不同的对象可以具有相同的地址


要在以后找到对象,您可以通过其他属性(它的一个或多个成员变量)对其进行比较,或者将其索引存储在向量中的某个位置。通常的方法是,每个对象都有一些“标识符”成员变量,这些变量至少对于存储在一个向量中的所有对象都是唯一的。

因为它是不同的对象。所有标准容器都拥有它们的对象,并且在标准容器中使用的所有类型都必须是可复制的


当你将一个对象传递给
push_back
时,它将被复制到向量中。如果您希望以后能够找到它,那么您的对象类型必须具有相等的概念,您可以在其中比较并找到等效的对象。(或者,您必须记住将每个对象放置在向量中的哪个位置。)

如果您不想将对象(类型T)的副本推入容器中,可以使用T的智能指针容器:

 std::vector< std::shared_ptr< Graph::GraphNode<int> > > c;

 std::shared_ptr< Graph::GraphNode<int> > p = std::shared_ptr< Graph::GraphNode<int> >(new Graph::GraphNode<int>(whatever));
 c.push_back(c);
std::vector>c;
std::shared_ptrp=std::shared_ptr(新图形::GraphNode(无论什么));
c、 推回(c);
通过这个,您可以比较指针

根据您的需要,您可以使用auto_ptr、shared_ptr、unique_ptr(或boost智能指针[2])

Boost也有指针容器[1]

另外,看看Boost.graph[3]是如何实现这个图的。您可能希望使用类似的方法

[1]

[2]


[3]

根据经验,记住STL使用复制语义。因此,除非STL容器是指针的集合,否则添加到STL集合中的任何元素都将被复制。

这非常有意义。现在想想,在一个图中有两个节点具有相同的值是非常愚蠢的,所以我应该为比较值的
GraphNode
类定义一个==运算符。谢谢你的帮助,我会尽快接受你的答复我不认为这是愚蠢的。您可能有不同的graphd noe,它们具有相同的值,但在图形中具有不同的链接。然而,在你的情况下可能不是这样。@ysdx:是的,你说得很对,这也是我的初衷。我认为,我基本上需要为每个节点分配一个UUID来处理这个问题。然而,我很幸运,在这种特殊情况下,我不需要支持相同值的多次出现——我或多或少地在为网络拓扑建模,其中设备a不能出现多次——至少,我希望是这样回答正确,谢谢。我接受查尔斯的回答只是因为他就我问题的“我应该怎么做?”方面提供了一些建议@乔希·格洛弗:当然可以,请随意。啊,是的,聪明的指针。这是一个很棒的解决方案——比我对UUID的想法要好得多。感谢所有伟大的答案,伙计们!
 std::vector< std::shared_ptr< Graph::GraphNode<int> > > c;

 std::shared_ptr< Graph::GraphNode<int> > p = std::shared_ptr< Graph::GraphNode<int> >(new Graph::GraphNode<int>(whatever));
 c.push_back(c);