c - 按值返回与按引用返回时的注意事项 - Set ADT C
问题描述
在 C 中查看 Set ADT 的头文件时,我试图理解为什么函数 setUnion 或 setIntersection 以这种方式声明:
Set setUnion(Set set1, Set set2);
Set setIntersection(Set set1, Set set2);
我找不到实现,但我假设在这些函数中,我们分配更多空间并创建新集,然后添加所有必要的元素。我认为 set1 和 set2 是通过引用传递的,那么为什么不更新其中一个并保存内存分配并只返回一些通知更新是否成功的枚举呢?(例如我们可以更新 left 参数)。
如果它们不是通过引用传递的,我该如何更改签名才能这样做?
谢谢!
解决方案
几乎可以肯定的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
推荐阅读
- c - 无延迟使用蜂鸣器[C] STM32
- jenkins - 为使用 jenkinsci kubernetes-plugin 创建的 jenkins slave 配置 Kubernetes cpu 内存请求和限制
- react-apollo - 访问 InMemoryCache 中 dataIdFromObject 内部的查询变量?
- amazon-web-services - 解决方案栈具体版本后如何从elasticbeanstalk获取最新的解决方案栈?
- python - 当列表大小不是某个值的倍数时,我应该引发什么错误?
- cmake - CMAKE:使用 ld(设置 CMAKE_CXX_LINK_EXECUTABLE)作为链接器的“-rdynamic”问题
- solr - 如何从 SOLR 结果中排除特定数据?
- jupyter-notebook - 在 Jupyter Notebook 中录制音频
- javascript - Chartist.js - 为什么圆环图的中心是黑色的?
- javascript - 使用装饰器设置初始类属性值