使用结构体按值或引用传递

Pass by value or reference using struct

本文关键字:引用 结构体      更新时间:2023-10-16

我对c++相当陌生,我有一个关于通过引用传递元素的问题。我定义了以下结构体

struct Point 
{
        bool isOnEnvelop;
        double x, y;
};   

和下面的函数

vector<Point> convex_hull(vector<Point> P)
{
        int n = P.size(), k = 0;
        vector<Point> H(2*n);
        for (int i = 0; i < n; i++) 
        {
           // IF SOMETHING ....
                       P[i].isOnEnvelop = true;
                       H[k] = P[i]
                       k++
        }
        H.resize(k-1);
        return H;
}

有如下的main

main() 
{ 
     vector<Point> P;
     // FILL P with Point and set Point.isOnEnvelop = false
     vector<Point> H = convex_hull(P);
}

该算法在二维空间中构建一组点的凸包。我希望能够在循环P的元素时能够检测到该点是否在凸壳上(因此检查P.at(I). isonenvelope))不幸的是,在调用函数convex_hull之后,点的状态不会改变。我应该通过引用传递参数吗?还是应该把P写成点*的向量?

谢谢你的帮助

文森特

您声明convex_hull的方式,参数被复制:

vector<Point> convex_hull(vector<Point> P){ ... }

这通常是一个坏主意,因为复制P可能很昂贵。如果您想确保P本身不被修改,另一种选择是使用const引用。

如果希望在调用函数时修改P(例如在main中进行修改),则必须通过引用传递它,并按如下方式声明convex_hull(注意&):

vector<Point> convex_hull(vector<Point> &P){ ... }

因此,在阅读您的评论后,您希望P的更改在调用convex_hull后反映在main中,因此您应该通过引用传递它,如:

std::vector<Point> convex_hull(std::vector<Point> &P)

如果您不通过引用传递,则vector将被复制,并且副本将被修改,而不是原始的。即使您不想修改原始代码,您也可以将其作为const引用传递,以获得不复制vector的好处,如下所示:

std::vector<Point> convex_hull(const std::vector<Point> &P)

如果你的数据要被修改,传递引用作为参数或给出值代替

您可以将change vector<Point> P更改为vector<Point> &P,以便您可以修改矢量p