我对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 *的向量?
非常感谢你的帮助
文森特
答案 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> P
到vector<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)
如果要修改数据,请将参考作为参数传递或改为赋予值