【发布时间】:2021-12-04 05:08:28
【问题描述】:
在 Leetcode 中出现免费错误后获得堆使用,似乎不明白根本原因。你们能帮我吗?
几乎所有东西都在堆栈上声明。我唯一的怀疑是我在堆栈 multiset temp 上创建的浅拷贝,但是您不能释放堆栈上没有在堆上创建的任何东西?
class Solution {
public:
void earn_points(multiset<int> points,int currpoint, int& max){
set<int> unique;
if(points.size() == 0){
cout <<"finalscore="<< currpoint << " "<<endl;
if(currpoint > max){
max = currpoint;
}
}
multiset<int> temp = points;
for(auto it=points.begin(); it != points.end(); ++it){
int num = *it;
if(unique.find(num) != unique.end()){
continue;
}
unique.insert(num);
int delete_num1 = num + 1;
int delete_num2 = num - 1;
points.erase(it);
if(points.find(delete_num1) != points.end())
points.erase(delete_num1);
if(points.find(delete_num2) != points.end())
points.erase(delete_num2);
cout << num <<" ";
for(auto i : points){
cout << i <<" ";
}
cout << endl;
earn_points(points,currpoint + num,max);
points = temp;
}
}
int deleteAndEarn(vector<int>& nums) {
multiset<int> points(nums.begin(),nums.end());
int max = INT32_MIN;
earn_points(points,0,max);
return max;
}
};
【问题讨论】:
-
由于您没有进行手动内存管理,请仔细阅读您正在使用的容器的Iterator Invalidation Rules,并确保您没有意外违反其中一项规则。
-
这里有一个近乎失败的副本,您可以使用它来帮助解决您的问题:Deleting elements from std::set while iterating
-
我想你可能希望
points.erase(it);成为it = points.erase(it);。 -
需要的不仅仅是
it = points.erase(it);如果您将迭代器推进到erase,您不想在for中使用++it再次推进它。
标签: c++ heap-memory