在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);
它给了我一个分段错误,我做错了什么?
【问题讨论】:
您正在引用未定义的指针。 Astd::vector
已经只是对包含对象的实际内存的引用,因此您的原始代码只是复制引用(如果未应用 NRVO 直接在调用者需要的地方构造向量它)。这就是 C++11“移动构造函数/移动赋值”的好处。如果您发现原始正确代码的速度变慢,请使用更好的编译器。
It works, but this process is being done many many times, and it's slow,
你有证据证明它很慢吗?或者你猜它会很慢?另外,如果您进行了测量,您是否测量了程序的优化版本?
请注意,在您的情况下无法使用 NRVO,因为在初始化期间未创建临时向量。可以用初始化代替赋值吗?
最后,如果您没有也无法获得支持 C++11 右值引用的编译器,请使用swap
。
【参考方案1】:
您正在返回对局部变量的引用。变量temp1
在returnMoves
退出后超出范围,导致未定义的行为。如果你想避免复制,你可以像这样简单地传递你想要填充的对象:
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 ++中通过引用返回类的向量[重复]的主要内容,如果未能解决你的问题,请参考以下文章