c++传参时 值传递和引用传递的区别
值传递需要开辟存储空间并拷贝这个对象,引用传递只是给这个对象起了一个别名,不涉及开辟空间和拷贝操作,引用传递更高效
值传递在调用函数中修改的不是原来的对象,而引用传递在调用函数中就能直接修改原来的对象
举个例子体会一下:435. 无重叠区间
贪心算法求解,涉及到排序操作,排序函数中需要指定按照结束时间排序,就涉及到给排序函数传递参数
值传递,直接超时
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int cnt = 0;
// 按finish time排序
sort(intervals.begin(), intervals.end(), [](vector<int> a, vector<int> b){
return a[1] < b[1];
});
// 遍历若当前区间和前一个没有重叠 可以留下 否则需要删除
int last_end = intervals[0][1];
for(int i = 1; i < intervals.size(); ++i){
if(intervals[i][0] < last_end){
cnt++;
}
else{
last_end = intervals[i][1];
}
}
return cnt;
}
改为引用传递,正确
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int cnt = 0;
// 按finish time排序
sort(intervals.begin(), intervals.end(), [](vector<int> &a, vector<int> &b){
return a[1] < b[1];
});
// 遍历若当前区间和前一个没有重叠 可以留下 否则需要删除
int last_end = intervals[0][1];
for(int i = 1; i < intervals.size(); ++i){
if(intervals[i][0] < last_end){
cnt++;
}
else{
last_end = intervals[i][1];
}
}
return cnt;
}