在c ++中通过引用返回类的向量[重复]

Posted

技术标签:

【中文标题】在c ++中通过引用返回类的向量[重复]【英文标题】:Return a vector of a class by reference in c++ [duplicate] 【发布时间】:2014-12-28 01:11:55 【问题描述】:

我有一个返回类向量的函数:

vector<movement> returnMoves(int startx, int starty, int bb[][8], int side)

vector<movement> moves;
movement adding;
moves.push_back(adding); moves.push_back(adding); //example

return moves;

而我是从 main 中以这种方式调用函数的:

vector<movement> t1;
t1 = returnMoves(startx, starty, bb, 1);

它可以工作,但是这个过程已经完成了很多次,而且速度很慢,所以我想让它更快,所以我正在考虑通过引用或指针返回: 这是我尝试过的:

vector<movement> & returnMoves(int startx, int starty, int bb[][8], int side)
vector<movement> temp1;
vector<movement>& moves = temp1;
moves.push_back(adding); moves.push_back(adding);
return moves;

并以同样的方式调用它:

 t1 = returnMoves(startx, starty, bb, 1);

它给了我一个分段错误,我做错了什么?

【问题讨论】:

您正在引用未定义的指针。 A std::vector 已经只是对包含对象的实际内存的引用,因此您的原始代码只是复制引用(如果未应用 NRVO 直接在调用者需要的地方构造向量它)。这就是 C++11“移动构造函数/移动赋值”的好处。如果您发现原始正确代码的速度变慢,请使用更好的编译器。 It works, but this process is being done many many times, and it's slow, 你有证据证明它很慢吗?或者你猜它会很慢?另外,如果您进行了测量,您是否测量了程序的优化版本? 请注意,在您的情况下无法使用 NRVO,因为在初始化期间未创建临时向量。可以用初始化代替赋值吗? 最后,如果您没有也无法获得支持 C++11 右值引用的编译器,请使用swap 【参考方案1】:

您正在返回对局部变量的引用。变量temp1returnMoves 退出后超出范围,导致未定义的行为。如果你想避免复制,你可以像这样简单地传递你想要填充的对象:

void generateReturnMoves(vector<movement>& populateThis, int startx, int starty, int bb[][8], int side)
//Add all the movement objects you need to populateThis

现在,您可以将其用作:

vector<movement> t1;
generateReturnMoves(t1, startx, starty, bb, 1);

【讨论】:

您可以改为返回一个指针,但您必须使用 new 分配向量。要么在函数中分配,要么让客户端传入分配的指针。只需确保明确使用该函数的人负责在完成后调用 delete。 感谢 Pradhan,您能否准确告诉我要更改的内容?我还不熟悉指针 @Ori 将其编辑为答案。 @CaptainObvlious 按值返回会导致它被创建两次,一次在函数中,一次在返回时。用指针返回只创建一次向量,然后只创建一个返回指针。在大多数情况下,通过引用传入和返回的已编辑答案可能更可取。 @Dtor:不是在现代 C++ 中它没有。返回局部变量是 move 自动启动的地方之一。

以上是关于在c ++中通过引用返回类的向量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何访问在 C++ 中通过引用传递的列表/向量的元素

在 C++ 中通过引用与按值将向量传递给函数

matlab中通过getposition方法获取位置向量返回之间的关系

在C中通过引用传递一个char数组

在C中通过引用传递数组?

C ++参考如何在幕后工作[重复]