在c ++中从函数返回向量的最佳方法是什么?

man*_*ans 11 c++ stl

我有一个返回如下数组的函数:

vector<string> GetString()
{
   vector<string> s;
   s.push_back("one");
   s.push_back("two");
   s.push_back("three");
   return s;
}
Run Code Online (Sandbox Code Playgroud)

我用这种方式称呼它:

   vector<string> mystrings=GetStrings();
Run Code Online (Sandbox Code Playgroud)

我也可以按如下方式实现:

void GetString(vector<string> & s)
{
   s.push_back("one");
   s.push_back("two");
   s.push_back("three");
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式调用它:

 vector<string> mystrings;
 GetStrings(mystrings);
Run Code Online (Sandbox Code Playgroud)

哪一个更好?

版本1是否将矢量复制到另一个?如果是,那么如果向量很大则它很慢.

Mik*_*our 17

哪一个更好?

他们做不同的事情.如果你想要一个只包含那些字符串的向量,请使用第一个; 如果您希望能够将这些字符串附加到现有向量,请使用第二个.

如果你想要第一个版本的语义,那么在更容易正确使用和更难以正确使用的意义上,这是"更好".

版本1是否将矢量复制到另一个?

在现代C++中,绝对不是:返回局部变量并从临时初始化都是通过移动而不是复制来完成的.即使你坚持使用前C++ 11编译器,也应该省略这两个副本.如果你的编译器不支持移动语义或复制省略,那么你真的应该抛弃它.

  • @mans:复制省略意味着该对象是在调用者的堆栈框架中创建的,因此不需要在返回时进行复制。移动意味着向量的内容通过更新其内部指针而不是通过复制元素而转移到另一个。任何体面的编译器都应支持省略,但这不是强制性的。所有C ++ 11编译器都必须支持移动语义。 (2认同)