首页 > 解决方案 > 按值返回与按引用返回时的注意事项 - Set ADT C

问题描述

在 C 中查看 Set ADT 的头文件时,我试图理解为什么函数 setUnion 或 setIntersection 以这种方式声明:

Set setUnion(Set set1, Set set2); 
Set setIntersection(Set set1, Set set2);

我找不到实现,但我假设在这些函数中,我们分配更多空间并创建新集,然后添加所有必要的元素。我认为 set1 和 set2 是通过引用传递的,那么为什么不更新其中一个并保存内存分配并只返回一些通知更新是否成功的枚举呢?(例如我们可以更新 left 参数)。

如果它们不是通过引用传递的,我该如何更改签名才能这样做?

谢谢!

标签: csetpass-by-referenceadtpass-by-value

解决方案


几乎可以肯定的Set是隐藏在 typedef 后面的指针,因此有一个实际的内部引用传递,struct这是最重要的。


通常需要计算两个集合的并集或交集而不改变其中任何一个。事实上,很有可能

Set result = setIntersection(set1, set2);
freeSet(set1);
set1 = result;

性能不会低于您建议的替代方案

setIntersectionInPlace(set1, set2);

而计算不可变集合交集的更常见setIntersectionInplace情况需要编写

Set result = setCopy(set1);
setIntersectionInplace(result, set2);

这将制作 a 的不必要副本set1该副本更大,或大小等于result


推荐阅读