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

来源:6-4 队列的典型应用 Binary Tree Level Order Traversal

慕慕9414451

2017-11-17

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

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

写回答

1回答

liuyubobobo

2017-11-18

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


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


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


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


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

2
4
慕慕9414451
回复
liuyubobobo
对对,const。谢谢老师再次提醒!
2017-11-18
共4条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程