C ++,什么时候应该返回引用?

时间:2015-12-01 05:46:03

标签: c++ sorting vector stl

var cells = $(this).closest('tr').children('td');
alert(cells.eq(0).text());
//$('#Code').val(cells.eq(0).text());
//$('#ProdName').val(cells.eq(1).text());

在Main函数的某个地方我有STL排序:

class Node{   
private:    
vector<Node*> children;    

public:     
vector< Node* > getChildren ();    
//or    
vector< Node* >& getChildren();
}    
如果使用vector&lt;

就会出现问题。节点*&gt; getChildren()代码将有不好的过剩问题,只使用vector&lt;节点*&amp;&amp; getChildren()有效。 我很困惑,为什么只有参考在这种情况下起作用?

2 个答案:

答案 0 :(得分:4)

当您没有返回引用时,getChildren每次调用时都会返回vector的新副本。

这意味着在这一行:

stl::sort((n->getChildren()).begin(),(n->getChildren()).end(),comp);

第一次调用getChildren会返回与第二次调用getChildren不同的副本。这意味着begin()end()位于不同的向量上,因此您永远无法从一个迭代到另一个。

当您返回引用时,两个调用都会返回对同一向量的引用,因此您可以从begin()迭代到end()

答案 1 :(得分:0)

添加@TheDark所说的内容(对我而言,没有明确说明): 引用返回属于类的实际向量。因此,如果对向量进行修改,则对类和其他函数中的向量进行修改,类将看到更改。

如果您返回副本,则仅对副本进行更改,类和其他功能将不会看到更改。

如果您想在本地对矢量进行排序而不是对类中的矢量进行排序,则需要执行以下操作(由@TheDark提供的原因,为此您可以返回引用或副本):

vector< Node* > localVector = n->getChildren();
stl::sort(localVector.begin(), localVector.end(), comp);