使用struct传递值或引用

时间:2013-05-29 12:33:10

标签: c++ pass-by-reference

我对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);
}

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

非常感谢你的帮助

文森特

4 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:0)

您可以change vector<Point> Pvector<Point> &P,以便修改矢量P.

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

如果要修改数据,请将参考作为参数传递或改为赋予值