在 C++ 中返回一个向量

Posted

技术标签:

【中文标题】在 C++ 中返回一个向量【英文标题】:Returning a vector in C++ 【发布时间】:2014-01-06 14:11:19 【问题描述】:

我刚刚阅读了this post on SO,它讨论了 STL 向量在内存中的存储位置。根据接受的答案,

vector<int> temp;

栈上向量的头信息,堆上的内容。

那么,下面的代码会出错吗?

vector<int> some_function() 
  vector<int> some_vector;
  some_vector.push_back(10);
  some_vector.push_back(20);
  return some_vector;

我应该改用vector&lt;int&gt; *some_vector = new vector&lt;int&gt; 吗?上面的代码会导致一些内存分配问题的代码吗?如果我使用自定义类的实例而不是 int,这种情况会改变吗?

【问题讨论】:

some_function 中的代码很好,可以正常工作。它将复制(使用复制构造函数)some_vector 的内容到接收向量中。 你的函数很好,避免使用动态分配的内存,除非它真的需要并且你知道你在做什么。 @JoachimPileborg:实际上,我认为它会将向量移动。不会吗? @yzt 在 C++11 编译器中,是的,它可能会。 通过复制返回向量会更慢,对吧?我的意思是它必须将所有内容复制到接收向量中。如果您担心速度,请将向量移动到池中并返回指向它的指针。 【参考方案1】:

你的代码很好。

向量管理它们为您分配的所有内存。

无论他们是使用动态分配来存储所有内部数据,还是将某些元数据作为直接成员(具有自动存储持续时间),都没有关系。任何内部执行的动态分配都将在向量的析构函数、复制构造函数和其他类似的特殊函数中安全地清除。

您无需执行任何操作,因为所有这些都已从您的代码中抽象出来。您的代码对该机制没有可见性,并且动态分配向量本身不会对其产生任何影响。

这就是他们的目的!

【讨论】:

【参考方案2】:

如果您决定动态分配向量,即使在非常简单的情况下也很难正确销毁它(不要忘记异常!)。尽可能避免动态分配。

换句话说,您的代码完全正确。我不会担心将返回的向量复制到内存中。在这些简单的情况下,编译器(在发布版本中)应该使用返回值优化/RVO(http://en.wikipedia.org/wiki/Return_value_optimization)并在返回对象的内存中创建 some_vector。在 C++11 中,您可以使用移动语义。

但如果你真的不信任使用 RVO 的编译器,你总是可以传递一个对向量的引用并将其填充到函数中。

//function definition
void some_function(vector<int> &v)  v.push_back(10); v.push_back(20); 

//function usage
vector<int> vec;
some_function(vec);

回到动态分配,如果你真的需要使用它,试试称为 RAII 的模式。或者使用智能指针。

【讨论】:

【参考方案3】:

在内部向量定义其数据的位置并不重要,因为您通过副本返回向量。:)(按值)这与返回整数相同

int some_function()

   int x = 10;
   return x;

【讨论】:

以上是关于在 C++ 中返回一个向量的主要内容,如果未能解决你的问题,请参考以下文章

从函数 C++ 返回向量

c++ 以最佳方式返回结构和向量

如何在 C++ 中返回从零开始的向量索引

如何在 C++ 中通过引用返回向量

如何使用返回向量的 C++ DLL

返回一个空向量c ++ [重复]