使用set获取分段错误

时间:2017-08-19 16:30:43

标签: c++ set

我的代码出了什么问题。我在提交时遇到分段错误。

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;

int main() {
    int t;
    cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        int x;
        set<int> s;
        for(int i=0;i<n;i++){
            cin>>x;
            s.insert(x);
        }
        int m;
        int ans=0;
        for(int i=0;i<k;i++){
            m=*s.rbegin();
            ans+=m;
            s.insert(m/2);
            s.erase(m);

        }
        cout<<ans<<"\n";
    }
    return 0;
}

问题的限制因素是:

1≤T≤10

1≤N≤10^ 5

0≤K≤10^ 5

0≤Si≤10^ 5

3 个答案:

答案 0 :(得分:1)

使用n=1k=2x=0,您将0插入集合中,然后再次插入0(不执行任何操作),然后移除{ {1}}来自集合。在下一轮0轮次中,您将尝试阅读空集的k,从而导致崩溃。

答案 1 :(得分:0)

如果删除最后一个元素,则容器为空。

然后尝试取消引用迭代器会导致未定义的行为(可能是程序崩溃)。

我建议您检查是否有任何(至少一个)元素,如果没有,则打破循环。

实施例

for(int i=0;i<k && s.size()!=0 ;i++){

答案 2 :(得分:0)

在访问要设置的元素之前,请检查您的设置是否为空。

if(!s.empty()){
        m=*s.rbegin();
        ans+=m;
        s.insert(m/2);
        s.erase(m);
}