当查看 C 中 Set ADT 的头文件时,我试图理解为什么函数 setUnion 或 setIntersection 是这样声明的:
Set setUnion(Set set1, Set set2);
Set setIntersection(Set set1, Set set2);
我找不到实现,但我假设在这些函数中,我们分配更多空间并创建新集,然后添加所有必要的元素。 我认为 set1 和 set2 是通过引用传递的,那么为什么不更新其中一个并保存内存分配并只返回一些枚举来通知更新是否成功呢? (例如我们可以更新左侧参数)。
如果它们不是通过引用传递的,我如何更改签名才能这样做?
谢谢!
最佳答案
Set
几乎可以肯定是隐藏在 typedef 后面的指针,因此内部 struct
的引用确实存在,这才是最重要的。
通常不需要需要计算两个集合的并集或交集而不改变其中任何一个。事实上很有可能
Set result = setIntersection(set1, set2);
freeSet(set1);
set1 = result;
性能不会比您建议的替代方案低
setIntersectionInPlace(set1, set2);
而使用 setIntersectionInplace
计算不可变集合的交集的更常见情况则需要编写
Set result = setCopy(set1);
setIntersectionInplace(result, set2);
这会生成 set1
的不必要的副本,该副本较大或等于结果
的大小
关于c - 按值返回与按引用返回时有哪些注意事项 - Set ADT C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57951932/