请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,请问何时用引用,何时用数组名

在leetcode的第239题求滑动窗口最大值问题中,函数为vector<int> maxSlidingWindow(vector<int>& nums, int k)。

请问老师,为什么形参是vector<int>& nums?能不能用vector<int> nums?因为前面看老师的代码,当用vector数组时并没有使用引用。更延伸一些,何时用指针呢?

正在回答

1回答

liuyubobobo 2017-11-18 02:20:20

在课程中的参数我都是用leetcode的解题模板的自带参数,没有动。所以我的代码如果没有用引用,应该是解题模板自带的参数没有引用。leetcode很多问题解题模板中传入vector参数没有使用引用,但使用引用性能更高,如果很多问题不需要对原数组进行改动,比如这个问题,最好应该使用const vector<int>& nums。


传入vector<int>还是vector<int>&的区别是按值传参还是按引用传参的区别。也就是传入vector<int>的话,整个vector会重新复制一遍。


在C++语言中,引用本身比较复杂,和其他语言中的引用概念不很一致。实质是指针的一次封装。在实践中,引用最常用的地方就是在函数参数的设计上,可以进行按引用的传参。否则,没有引用的话,想在函数中按引用传参,只能靠指针。


指针除了可以在函数传参中做到按引用传参,还可以用于动态空间的管理。比如如果想制作链表或者二叉树这种动态数据结构,就需要指针。另外C系语言中使用指针也可以方便的管理连续内存,所以很多和数组相关的地方,包括字符串,都可以看到指针的影子。


我个人在实际编程中,引用最大的用途就是按引用传参的。其他需要的地方基本都用指针。不过也有少数类设计中类成员由于性能考虑使用引用比较好的情况,但总体也可以使用指针取代。具体无论是引用还是指针都是很庞大也很高级的话题,不是我在问答区一两句话能说清楚的,如果感兴趣的话建议深入研究C++相关语法的资料。

2 回复 有任何疑惑可以回复我~
  • 提问者 慕慕9414451 #1
    谢谢老师,在看书的过程中,我也在一直总结。因此也想听听您的看法。谢谢老师耐心详细的解答!非常感谢!
    回复 有任何疑惑可以回复我~ 2017-11-18 07:06:26
  • 提问者 慕慕9414451 #2
    记得看c++ primer一书的时候,作者就建议应尽可能使用引用。我理解为尽量避免按值赋值。还有就是我体会,用指针和引用有的时候差别不大,都可以。
    因此,当我看到leetcode好多数组参数都不采用引用时,有了一点困惑。不过想想,leetcode没有这么做,也没什么问题。还是自己理解不深入导致的。
    谢谢老师!
    回复 有任何疑惑可以回复我~ 2017-11-18 07:14:37
  • liuyubobobo 回复 提问者 慕慕9414451 #3
    再强调一下:对于传入一个vector,如果这个vector不变,最好传入const vector<int>&;如果改变,最好应该传入vector<int>&。直接传入vector<int>确实性能不优,在实践中也不是常规写法。只是leetcode解题模板是这么给出的,我没有动而已!后续可以看到我会设立一些函数,如果传入的是vector,都会使用引用的方式。
    回复 有任何疑惑可以回复我~ 2017-11-18 07:22:28
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信