使用结构体按值或引用传递
Pass by value or reference using struct
我对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
相关文章:
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 包含 std::list 的结构体的 C++ 初始化
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何使用结构体的向量数组?
- 如何使用结构体在C++中更改这些代码?
- 在结构中使用 switch 引用结构中的数据C++
- 无法在 Mosquitto MQTT Broker 插件上访问结构体 mosquitto 的元素
- 我应该如何在C++中使用结构体解决输入失败的问题?
- Qsort() 比较结构体整数的总和
- CUDA:结构体的共享数据成员和对该结构体的引用成员具有不同的地址和值
- 如何通过引用传递二进制搜索的结构体
- 封送c++结构体作为c#中的引用
- 使用结构体按值或引用传递
- 通过引用传递结构体参数
- 传递指向结构体的引用作为模板参数
- 按值返回结构体vs按引用返回结构体
- 如何通过引用传递c#结构体
- 引用模板类中声明的结构体