2

我对 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() 
{ 
     vector<Point> P;
     // FILL P with Point and set Point.isOnEnvelop = false
     vector<Point> H = convex_hull(P);
}

该算法正在构建二维空间中一组点的凸包。我希望能够在循环 P 的元素时检测该点是否在凸包上(因此检查 P.at(i).isOnEnvelop)不幸的是,调用函数后点的状态没有改变凸壳。我应该通过引用传递参数吗?或者我应该创建 P 作为 Point* 的向量?

非常感谢你的帮助

文森特

4

4 回答 4

4

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

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

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

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

vector<Point> convex_hull(vector<Point> &P){ ... }
于 2013-05-29T12:40:26.933 回答
0

您可以change vector<Point> P修改vector<Point> &P向量 P。

于 2013-05-29T12:37:23.020 回答
0

因此,在阅读您的评论后,您希望更改在调用后P反映,因此您应该像这样通过引用传递它:mainconvex_hull

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

如果您不通过引用传递,vector则将被复制并且副本将被修改而不是原始文件。即使您不想修改原件,您也可以作为const参考传递,以获得不复制vector类似内容的优势:

std::vector<Point> convex_hull(const std::vector<Point> &P)
于 2013-05-29T12:40:12.230 回答
0

如果您的数据将被修改,请将引用作为参数传递或给出值

于 2013-05-29T12:40:35.497 回答